Преобразование простого запроса edismax в Solr в Elastic Search - PullRequest
0 голосов
/ 24 мая 2019

В 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"
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...