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

Чего я хочу добиться:

документ: "один два три четыре"

Строки поиска:

  • "одна четверка" (должна совпадать)
  • "четыре один" (не должно совпадать)

Что я узнал так далеко:

Для того чтобы быть учтенным, span_near Следует использовать запрос, но это предполагает, что условия уже проанализированы клиентом (все термины должны быть предоставлены отдельно).

Чтобы проанализировать строку поиска, phrase_match Запрос должен быть использован, но он не принимает во внимание порядок.

Вероятно, следует использовать скрипт (спасибо @ChintanShah25), но кажется невозможным проанализировать входную строку внутри скрипта.

Как добиться как анализа, так и требований заказа?

1 ответ

Нет простого способа достичь этого, вы можете сделать это с помощью любого _analyze конечная точка с span query или с script а также match_phrase

1) Вы передаете строку поиска в _analyze с помощью

curl -XGET 'localhost:9200/_analyze' -d '
{
  "analyzer" : "my_custom_analyzer",
  "text" : "one four"
}'

вы получите что-то вроде этого

{
   "tokens": [
      {
         "token": "one",
         "start_offset": 0,
         "end_offset": 3,
         "type": "<ALPHANUM>",
         "position": 1
      },
      {
         "token": "four",
         "start_offset": 4,
         "end_offset": 8,
         "type": "<ALPHANUM>",
         "position": 2
      }
   ]
}

Затем вы передаете токены span query

{
    "span_near" : {
        "clauses" : [
            { "span_term" : { "field" : "token1" } },
            { "span_term" : { "field" : "token2" } }
        ],
        "slop" : 2,
        "in_order" : true,
        "collect_payloads" : false
    }
}

2) Другой способ заключается в использовании сложных сценариев, взгляните на ответ @Andrei Stefan на этот вопрос, он использовал _POSITIONS с match_phrase вернуть результаты с условиями в порядке.

Надеюсь это поможет!

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