Софт must_not в elastisearch

Я пытаюсь найти слово в списке документов в elasticsearch, исключая выражение, содержащее это слово.

Например, я хотел бы найти в следующем списке слово «хорошо», но мягко исключить выражение «довольно хорошо»:

  1. Это хороший документ.
  2. Это достаточно хороший документ.
  3. Это хороший документ. Это действительно неплохо.

Чтобы он возвращал 1 и 3, потому что у него есть экземпляр «хорошо», не содержащийся в выражении «вполне хорошо». Я пытался использовать BooleanQuery или SpanNotQuery, но документ № 3 каждый раз исключается.

Другой способ — использовать анализатор, удаляющий выражения, по которым я не хочу запускать поиск. Однако это делает мое исключение очень статичным, и его нельзя установить во время запроса.

Знаете ли вы, если и как это было бы возможно?

1
0
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Моя беда, SpanNotQuery действительно помог, я, должно быть, сначала неправильно протестировал его.

Этот запрос дает ожидаемый результат:

{
  "query": {
    "span_not": {
      "include": {
        "span_term": { "field": "good" }
      },
      "exclude": {
        "span_near": {
          "clauses": [
            { "span_term": {"field": "quite" }},
            { "span_term": {"field": "good" }}
          ],
          "slop": 0,
          "in_order": true
        }
      }
    }
  }
}

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