Многословный запрос ElasticSearch, сопоставление нескольких слов более ценно, чем совпадение нескольких, но много раз

Я пишу поисковый запрос из нескольких слов в ElasticSearch, совпадение нескольких слов более ценно, чем совпадение 1, но много раз.

1 запрос по нескольким полям:

{
      "bool" : {
        "must" : [
          {
            "simple_query_string" : {
              "query" : "effective date ",
              "fields" : [
                "field1^1.0",
                "field2^5.0",
                "field3^10.0",
              ],
              "flags" : -1,
              "default_operator" : "or",
              "analyze_wildcard" : false,
              "auto_generate_synonyms_phrase_query" : true,
              "fuzzy_prefix_length" : 0,
              "fuzzy_max_expansions" : 50,
              "fuzzy_transpositions" : true,
              "boost" : 1.0
            }
          }
        ],
        "adjust_pure_negative" : true,
        "boost" : 1.0
      }
    }

Когда я ищу "дата вступления в силу ИЛИ"

Например:

"Это пример даты для действительного расчета проблем"

должен набрать больше, чем:

«дата-дата-дата — вот что он сказал детям»

как я могу точно настроить эластичный поиск для этого?

Спасибо!


person emraldinho    schedule 17.06.2020    source источник


Ответы (1)


Поскольку вы не упомянули в вопросе о том, сколько полей вы проиндексировали, я взял только одно поле, т.е. title

Проиндексированные документы:

{
    "title":"This is an example date for effective calculation of the problems"

}
{
    "title":"date date date is what he said to the children"

}

Поисковый запрос:

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "effective date",
            "operator": "or",
            "fields": [
             "title"                    --> If you have more fields, you can 
                                            add them here
            ]
          }
        }
      ]
    }
  }
}

Результат поиска:

"hits": [
        {
            "_index": "my_index",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.85874003,
            "_source": {
                "title": "This is an example date for effective calculation of the problems"
            }
        },
        {
            "_index": "my_index",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.289459,
            "_source": {
                "title": "date date date is what he said to the children"
            }
        }
    ]

Чтобы получить подробное объяснение запроса Multi-Match, вы можете обратиться к этому официальному документация

ОБНОВЛЕНИЕ 1:

Используя query_string

    {
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "effective OR date"
    }
  }
}

Чтобы получить подробное объяснение query_string, вы можете обратиться к это

ОБНОВЛЕНИЕ 2:

Использование simple_query_string

{
  "query": {
    "simple_query_string" : {
        "query": "effective date",
        "fields": ["title"],
        "default_operator": "or"
    }
  }
}

Используя все три вышеуказанных поисковых запроса, вы получаете один и тот же результат поиска, и нет никакой разницы в _score

person ESCoder    schedule 17.06.2020
comment
это работает, спасибо - есть ли способ сделать это в запросе query_string query или simple_query_string? - person emraldinho; 17.06.2020
comment
@emraldinho спасибо, что приняли мой ответ :), и вы можете просмотреть мой обновленный ответ, который включает поисковый запрос с использованием query_string - person ESCoder; 17.06.2020
comment
спасибо за обновленный ответ, я пытаюсь использовать simple_query_string, и оценка сильно отличается - есть идеи, почему это может быть? - person emraldinho; 17.06.2020
comment
@emraldinho вы получите тот же результат поиска и тот же балл, пожалуйста, просмотрите мой обновленный ответ - person ESCoder; 17.06.2020
comment
Спасибо за ответ, извините, когда я использую тип CROSS_FIELDS, это действительно дает мне лучший результат - person emraldinho; 17.06.2020