У меня есть следующий документ в elasti c индексы / кластеры поиска
[
{id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'},
{id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'},
{id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'},
{id: 4, firstName: 'Test', lastName: 'Mason', nickName: 'John'},
{id: 5, firstName: 'John', lastName: 'Doe'},
//should not search this
{id: 6, firstName: 'John', lastName: 'Glow', nickName: 'NonSearchText'}
];
Мое требование поиска, которое похоже на поиск контактов на мобильном телефоне:
Релевантный поиск должен начинаться сначала с ником затем lastName. Если никнейм не указан, он должен искать по firstName с AS C порядком сортировки
Текст поиска: John
Следовательно, результат поиска должен быть
[
// search with nickName as higher relevance and then sorted it
{id: 4, firstName: 'Test', lastName: 'Mason', nickName: 'John'},
{id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'},
// search with lastName as second higher relevance and then sorted it
{id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'},
{id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'},
// search with firstName as nickName is null
{id: 5, firstName: 'John', lastName: 'Doe'},
// and omitted one record
];
Записан запрос:
{
"sort" : [
{"lastName.keyword": "asc"},
{"nickName.keyword": "asc"}
],
"query": {
"bool": {
"must": [{
"query_string": {
"query": "John*",
"analyze_wildcard": "true",
"fields": ["nickName^3", "lastName^2"]
}
}]
}
}
}
Я не могу охватить следующий сценарий ios:
- Поиск на основе условий, если присутствует никнейм и даже если firstName совпадает с поисковым текстом, он не должен включать этот документ в поиск
- Поиск по firstName, если никнейм не указан
Любая помощь приветствуется.