В Solr у меня есть индекс имен пользователей, которые я использую с этими параметрами:
Когда вводится имя пользователя, я ищу каждый термин отдельно, а также каждый термин вместе (следовательно, кавычки), чтобы соответствоватьна полное имя выше, чем что-либо еще.Это прекрасно работает, но я изо всех сил пытаюсь создать эквивалент в Elastic search.
"q":"((Billy AND Smith) OR \"Billy Smith\") AND status:active",
"tie":".1",
"defType":"edismax",
"qf":"email^6 wholename^5 wholename.edge^3 firstname^2 nickname^1.5 lastname^1 firstname.edge^.5 lastname.edge^.3 wholename.phonetic^.3 nickname.phonetic^0.1",
"sort":"score desc, id asc"
Поскольку я хочу найти все эти термины хотя бы в одном поле, я не могу использовать "most_fields"или «best_fields», потому что оператор «и» означает, что все введенные мной термины должны существовать в одном поле, поэтому ввод нескольких терминов никогда не даст желаемых результатов.Я использовал cross_fields и разбил запрос, когда увидел, что есть проблемы с использованием multi_match с полями, имеющими разные анализаторы: «Тип cross_field может работать только в ориентированном на термы режиме в полях, в которых есть один и тот же анализатор».
Я пытаюсь что-то вроде примера ниже, но это не правильно, потому что в основном говорится, что это нормально, пока один термин (Билли, Смит, или в случае ключевых токенизаторов .."Билли Смит") соответствует одному полю.Мой запрос в Solr прошел бы, только если все термины соответствовали хотя бы одному полю.Поля без "."используют анализатор точного соответствия (токенайзер ключевых слов и фильтр нижних регистров и т. д.), чтобы я мог расставить приоритеты для точных соответствий.Я протестировал анализаторы с помощью _analyze API, поэтому я знаю, что анализаторы работают.Я просто не знаю, как спросить Эластика, как дать мне то, что я ищу.Например, если пользователь наберет Luke Walton Jr, я бы хотел, чтобы все 3 из этих терминов соответствовали хотя бы одному полю любого из предложенных мною.
{
"query": {
"bool" : {
"minimum_should_match" : 1,
"should" : [{
"multi_match" : {
"query" : "billy smith",
"type": "cross_fields",
"fields" : ["email^6", "wholename^5", "firstname^2", "nickname^1.5" "lastname^1"],
"tie_breaker":0.15
}},
{
"multi_match" : {
"query" : "billy smith",
"type": "cross_fields",
"fields" : ["wholename.edge^3", "firstname.edge^2", "lastname.edge^1"],
"tie_breaker":0.15
}},
{
"multi_match" : {
"query" : "billy smith",
"type": "cross_fields",
"fields" : ["wholename.phonetic^0.9", "nickname.phonetic^0.1"],
"tie_breaker":0.15
}
}],
"filter" :{
"term": {"status":"active"}
}
}
}
}
Обновление:
Я начал успешно использовать запрос строки запроса, но, похоже, он неработать, как рекламируется, когда пробелы включены.Он сопоставляет «Билли» и «Смит» с соответствующими полями, но ничего не совпадает с полем wholename, которое в данном примере является «Билли Смит».Я попытался добавить экранированные кавычки без изменений в результатах.
{
"size": 10,
"query": {
"query_string" : {
"default_operator" : "AND",
"fields" : ["email^6", "wholename^5", "firstname^2", "nickname^1.5" "lastname^1", "wholename.edge^3", "firstname.edge^2", "lastname.edge^1", "wholename.phonetic^0.9", "nickname.phonetic^0.1"],
"query" : "Billy Smith"
}
}
}