Elasticsearch match_phrase запрос и нечеткий запрос — оба могут использоваться вместе

Мне нужен запрос с использованием match_phrase вместе с нечетким соответствием. Однако я не могу найти документацию для создания такого запроса. Кроме того, когда я пытаюсь объединить запросы (один внутри другого), он выдает ошибки. Можно ли построить такой запрос?


person Ben Abey    schedule 29.11.2018    source источник
comment
multi_match может работает, поскольку он принимает как запрос типа фразы, так и нечеткость, хотя есть вероятность, что запрос фразы также принимает нечеткость, поскольку он в основном расширяет запрос соответствия   -  person apokryfos    schedule 29.11.2018
comment
эй @apokryfos multi_match не поддерживает нечеткое совпадение с фразой, как указано в этой ссылке elastic.co/guide/en/elasticsearch/reference/current/. Я думаю, что в версиях ES 6.x единственный способ реализовать fuzzy поиск с использованием match_phrase — это использовать Span Queries. Если это нечеткий поиск по одному полю, мы можем использовать нечеткий запрос, как указано в этой ссылке: elastic.co/guide/en/elasticsearch/reference/current/   -  person Opster ES Ninja - Kamal    schedule 29.11.2018


Ответы (1)


Вам нужно будет использовать Span-запросы.

Приведенный ниже запрос будет выполнять запрос фразовое соответствие+нечеткое для champions league, например, например. в примере поля name типа text

Если вам нужно несколько полей, добавьте еще одно предложение must.

Обратите внимание, что я упомянул slop:0 и in_order:true, которые обеспечивают точное совпадение фраз, в то время как вы добиваетесь нечеткого поведения, используя fuzzy запросы внутри match запроса.

Образцы документов

POST span-index/mydocs/1
{
  "name": "chmpions leage"
}

POST span-index/mydocs/2
{
  "name": "champions league"
}

POST span-index/mydocs/3
{
  "name": "chompions leugue"
}

Запрос диапазона:

POST span-index/_search
{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "span_near":{  
                  "clauses":[  
                     {  
                        "span_multi":{  
                           "match":{  
                              "fuzzy":{  
                                 "testField":"champions"
                              }
                           }
                        }
                     },
                     {  
                        "span_multi":{  
                           "match":{  
                              "fuzzy":{  
                                 "testField":"league"
                              }
                           }
                        }
                     }
                  ],
                  "slop":0,
                  "in_order":true
               }
            }
         ]
      }
   }
}

Ответ:

{
  "took": 19,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "span-index",
        "_type": "mydocs",
        "_id": "2",
        "_score": 0.5753642,
        "_source": {
          "name": "champions league"
        }
      },
      {
        "_index": "span-index",
        "_type": "mydocs",
        "_id": "1",
        "_score": 0.5753642,
        "_source": {
          "name": "chmpions leage"
        }
      },
      {
        "_index": "span-index",
        "_type": "mydocs",
        "_id": "3",
        "_score": 0.5753642,
        "_source": {
          "name": "chompions leugue"
        }
      }
    ]
  }
}

Позвольте мне знать, если это помогает!

person Opster ES Ninja - Kamal    schedule 29.11.2018
comment
Итак, нам нужно разделить запрос, например, лига чемпионов, на [чемпионы, лига], а затем сформировать DSL-запрос? - person StoneLam; 03.04.2019
comment
@StoneLam да, это правильно. Вы можете видеть, как строится запрос для каждого слова. В некотором смысле Span Queries, хотя и многословный и длинный, является более гибким. - person Opster ES Ninja - Kamal; 03.04.2019
comment
Спасибо @Karmal, я пробую это решение, но нечеткий запрос делает лучший автомобиль лучшим котом. Еще предстоит пройти долгий путь. - person StoneLam; 08.04.2019