Найти фактическое совпадающее слово при использовании нечеткого запроса в эластичном поиске


Я новичок в elasticsearch и искал fuzzy query search.
Я сделал новый индекс продуктов с объектами / записями значений, как это

{
            "_index": "products",
            "_type": "product",
            "_id": "10",
            "_score": 1,
            "_source": {
                "value": [
                    "Ipad",
                    "Apple",
                    "Air",
                    "32 GB"
                ]
            }
        }

Теперь, когда я выполняю нечеткий поиск запроса в elasticsearch, как

{
   query: {
       fuzzy: {
          value: "tpad"
       }
   }
}

Он возвращает мне правильную запись (продукт, только что сделанный выше), которая ожидается.
И я знаю, что термин tpad соответствует ipad, так что запись была возвращена.
Но технически, как бы я узнал, что он совпал ipad. Упругий поиск просто возвращает полную запись (или записи), как это

{
"took": 4,
"timed_out": false,
"_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
},
"hits": {
    "total": 1,
    "max_score": 0.61489093,
    "hits": [
        {
            "_index": "products",
            "_type": "product",
            "_id": "10",
            "_score": 0.61489093,
            "_source": {
                "value": [
                    "Ipad",
                    "Apple",
                    "Air",
                    "32 GB"
                ]
            }
        }
    ]
}
}

Есть ли какой-либо способ в эластичном поиске, чтобы я мог узнать, соответствует ли он tpad ipad

3 4

3 ответа:

Если вы используете выделение, Elasticsearch покажет соответствующие термины:

curl -XGET http://localhost:9200/products/product/_search?pretty -d '{
  "query" : {
    "fuzzy" : {
        "value" : "tpad"
      }
  },
  "highlight": {
    "fields" : {
        "value" : {}
    }
  }
}'

Elasticsearch вернет соответствующие документы с выделенным фрагментом:

{
  "took" : 31,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.13424811,
    "hits" : [ {
      "_index" : "products",
      "_type" : "product",
      "_id" : "10",
      "_score" : 0.13424811,
      "_source":{
 "value" : ["Ipad",
                "Apple",
                "Air",
                "32 GB"
                ]
           },
      "highlight" : {
        "value" : [ "<em>Ipad</em>" ]
      }
    } ]
  }
}

Если вы просто хотите проанализировать результат,вы можете использовать плагин Inquisitor.

Если вам нужно сделать это программно, я думаю, что функция подсветки поможет вам:

Определение того, какие слова были сопоставлены в нечетком поиске

Я знаю, что вопрос старше, но я только что столкнулся с ним. Я делаю это путем заполнения поля имя запроса при построении запроса. Таким образом, он вернется в поле "matchedQuery" в ответ. Надеюсь, это поможет :)