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

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

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

6 ответов

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

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

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "field": "web developer"
          }
        },
        {
          "match_phrase": {
            "field": "web developer",
            "boost": 5
          }
        }
      ],
      "minimum_number_should_match": 1
    }
  }
}

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

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

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

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

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

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-rescore.html

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

{ "query": {
"bool": {
  "should": [
    {
      "match": {
        "name": "pala"
      }
    },
    {
      "fuzzy": {
        "name": "pala"
      }
    }
  ]
}}}

У меня недостаточно репутации, чтобы комментировать ответ Джеймса Адисона , с которым я согласен. Чего все еще не хватает, так это коэффициента повышения, который можно сделать, используя следующий синтаксис:

      {
  "match_phrase": 
    {
        "fieldName": {
            "query": "query string for exact match",     
            "boost": 10
         }        

      }
}

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

Другие вопросы по тегам