При поиске всех сотрудников по идентификатору отдела сотрудники должны быть возвращены в поиске с порядком ASC тег, за исключением случаев, когда тег имеет значение null, что должно отправить его в конец поиска.
это связь структуры
Сотрудник
Идентификатор отдела
Название отдела
Тег
Сэм
101
Бухгалтерский учет
"ааа"
Сэм
102
Доставка
Null
Тим
101
Бухгалтерский учет
"эээ"
Тим
102
Доставка
"ззз"
и представление json:
Код: Выделить всё
{
"Name": "Sam",
"Departments": [
{
"ID": 101,
"Name": "Accounting",
"Tag": "aaa"
},
{
"ID": 102,
"Name": "Shipping",
"Tag": Null
},
]
},
{
"Name": "Tim",
"Departments" : [
{
"ID": 101,
"Name": "Accounting",
"Tag": "eee"
},
{
"ID": 102,
"Name": "Shipping",
"Tag": "zzz"
},
]
}
Но если мы ищем отдел доставки (102), тэг Сэма в этом отделе равен нулю; и у Тима есть значение тега для этого отдела, то Тим должен появиться первым.
Код: Выделить всё
When searching by Accounting ID (101) ASC --> Tag number determines order (aaa is before eee)
Sam
Tim
When searching by Shipping ID (102) ASC --> Tag number Null goes to bottom. zzz has precedence over null and therfore, Tim should show up first
Tim
Sam
Код: Выделить всё
var doc = new Document();
doc.Add(new Field("Name", "Sam", fieldStored));
doc.Add(new Field("Department.Id1", 101, fieldStored));
doc.Add(new Field("Department.Name1", "Accounting", fieldStored));
doc.Add(new Field("Department.Tag1", "aaa", fieldStored));
doc.Add(new Field("Department.Id2", 102, fieldStored));
doc.Add(new Field("Department.Name2", "Shipping", fieldStored));
doc.Add(new Field("Department.Tag2", null, fieldStored));
var doc = new Document();
doc.Add(new Field("Name", "Tim", fieldStored));
doc.Add(new Field("Department.Id1", 101, fieldStored));
doc.Add(new Field("Department.Name1", "Accounting", fieldStored));
doc.Add(new Field("Department.Tag1", "eee", fieldStored));
doc.Add(new Field("Department.Id2", 102, fieldStored));
doc.Add(new Field("Department.Name2", "Shipping", fieldStored));
doc.Add(new Field("Department.Tag2", "zzz", fieldStored));
Код: Выделить всё
public class TagComparator : FieldComparer
{
private readonly BytesRef[] bvalues;
..........................
public override FieldComparer SetNextReader(AtomicReaderContext context)
{
sortedResults = FieldCache.DEFAULT.GetTermsIndex(context.AtomicReader, field);
return this;
}
public override void Copy(int slot, int doc)
{
termCopy = new BytesRef();
sortedResults.Get(doc, termCopy);
bvalues[slot] = termCopy;
}
}
В данный момент он возвращает «Сэм» перед Тимом для отдела доставки (102), хотя номер тега Сэма равен нулю и « Тим" позже, хотя у него есть значение тега для этого отдела "zzz".
МОЯ ПОПЫТКА:
Поскольку на моих серверах выделено много ресурсов , я могу немного пожертвовать скоростью поиска, добавив больше кода в метод переопределения копирования. Решение будет означать:
- сохраните идентификатор отдела до того, как код поиска возьмет на себя управление
- Метод копирования будет выполняться один раз для каждого обращения пользователя, принадлежащего к этому отделу.
- получить весь документ хит, который показывает идентификатор отдела и значение номера тега
- если номер тега имеет допустимое значение, он отображается нормально, если нет, он отображается внизу
Код: Выделить всё
for (int i = 0; i < wholeDoc.GetValues("Department.Id").Length; i++) { if(int.Parse(wholeDoc.GetValues("Department.Id")[i]) == 1234) // department Id { string tagNumber= wholeDoc.GetValues("TagNumber")[i]; if (string.IsNullOrWhiteSpace(tagNumber)) SetBottom(doc); else bvalues[slot] = new BytesRef(wholeDoc.GetValues("TagNumber")[i]); break; } }
Подробнее здесь: https://stackoverflow.com/questions/787 ... ild-object
Мобильная версия