elasticsearch повышает важность точного совпадения фраз

Есть ли способ в elasticsearch повысить важность точной фразы, появляющейся в документе?

Например, если бы я искал фразу «веб-разработчик», и если слова «веб-разработчик» появились вместе, они были бы повышены на 5 по сравнению со словами «веб» и «разработчик», появляющимися в документе по отдельности. Таким образом, любой документ, содержащий слово «веб-разработчик» вместе, будет отображаться первым в результатах.


person user2724314    schedule 28.08.2013    source источник


Ответы (5)


Вы можете комбинировать разные запросы, используя bool-запрос, и вы также можете придать им различный импульс. Допустим, у вас есть обычный запрос на сопоставление для обоих термины, независимо от их позиций, а затем фразовый запрос с более высоким значением.

Что-то вроде следующего:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "field": "web developer"
          }
        },
        {
          "match_phrase": {
            "field": "web developer",
            "boost": 5
          }
        }
      ],
      "minimum_number_should_match": 1
    }
  }
}
person javanna    schedule 28.08.2013
comment
Но что происходит, когда я хочу выполнить такой запрос по нескольким индексам и различному набору полей? Насколько я знаю, match_phrase работает только с определенным именем поля. В моем случае мне нужно (вообще говоря) использовать что-то вроде { "query_string": { "query": "my exact phrase", "fields": ["typeA.fieldA", "typeB.fieldB"] } } - person leandroico; 12.05.2015
comment
Запрос [match_phrase] не поддерживает несколько полей - person Radu Simionescu; 06.12.2018
comment
также: [bool] запрос не поддерживает [minimum_number_should_match] - person Radu Simionescu; 06.12.2018

В качестве альтернативы ответу javanna вы можете сделать что-то подобное с предложениями must и should в запросе bool:

{
  "query": {
    "bool": {
      "must": {
          "match": {
            "field": "web developer",
            "operator": "and"
          }
      },
      "should": {
          "match_phrase": {
            "field": "web developer"
          }
      }
    }
  }
}

Не проверено, но я считаю, что предложение must здесь будет соответствовать результатам, содержащим и то, и другое «веб-сайт» и «разработчик», а предложение should даст более высокие оценки фразам, соответствующим «веб-разработчику».

person James Addison    schedule 29.08.2013
comment
Да, это дает более высокую релевантность документу с web developer в нем, но ОП хотел контролировать относительную важность (используя число 5). Например, в редких случаях документ с множеством токенов web и developer, появляющихся повсюду, может превзойти документ с одним web developer. С этим ответом вы придаете одинаковое значение обоим этим запросам (ссылка). - person Garrett; 26.02.2017

Вы можете попробовать использовать rescore для точного совпадения фраз с вашими первоначальными результатами. Из документов:

Повторная оценка может помочь повысить точность путем переупорядочивания только первых (например, 100–500) документов, возвращенных фазами запроса и post_filter, с использованием вторичного (обычно более дорогого) алгоритма вместо применения дорогостоящего алгоритма ко всем документам в индексе.

https://www.elastic.co/guide/en/elasticsearch/reference/current/filter-search-results.html#rescore

person Bailey Smith    schedule 06.02.2015

Я использовал приведенный ниже пример запроса в моем случае, который работает. Это дает точные + нечеткие результаты, но точные форсируются!

{ "query": {
"bool": {
  "should": [
    {
      "match": {
        "name": "pala"
      }
    },
    {
      "fuzzy": {
        "name": "pala"
      }
    }
  ]
}}}
person csonuryilmaz    schedule 28.05.2014

Я думаю, что его поведение по умолчанию уже с оператором запроса совпадения «или». Сначала он будет фильтровать фразу «веб-разработчик», а затем такие термины, как «веб» или «разработчик». Хотя вы можете повысить свой запрос, используя приведенные выше ответы. Поправьте меня если я ошибаюсь.

person bunny    schedule 29.05.2014