ElasticSearch, как убедиться, что все слова участвуют в поиске - PullRequest
0 голосов
/ 30 августа 2018

Допустим, у меня есть индекс в ElasticSearch 6:

"mappings" : {
  "pet" : {
      "name" : {
         "type" : "text"
      },          
      "info" : {
         "type" : "text"
      },
      "description" : {
         "type" : "text"
      }
   }
}

Мне нужно выполнить полнотекстовый поиск по всем полям с одной и той же строкой ввода, введенной пользователем: «большая серая собака» или «маленький милый кот». Как я могу по релевантности искать те единицы, которые содержат больше слов из ввода. Неважно, где - имя или описание. Я хочу эту единицу:

{
    "name" : "big",
    "info" : "grey",
    "description" : "dog" 
}

имеют более высокий балл, чем единица измерения:

{
    "name" : "grey dog",
    "info" : "dog dog grey dog",
    "description" : "grey dog grey dog grey dog" 
}

1 Ответ

0 голосов
/ 30 августа 2018

Если вы используете запрос multiMatch, вы должны использовать тип cross_field с оператором AND ( см. Здесь ).

Но так как он будет соответствовать только документу, содержащему все термины, вы должны использовать bool query с двумя предложениями should, свободным предложением с типом по умолчанию (aka best_fields) и оператором по умолчанию OR и строгим оператором. с типом cross_field и оператором AND.

При этом будут увеличены документы, соответствующие всем полям, и будет отображаться документ с меньшим количеством баллов, соответствующий только некоторым терминам:

Что-то вроде:

"query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "<here your query>",
            "fields": ["name", "info", "description"],
            "type": "cross_fields",
            "operator": "AND"
          }
        },
        {
          "multi_match": {
            "query": "<here your query>",
            "fields": ["name", "info", "description"],
          }
        }
      ]
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...