Elasticsearch 6.3.2 - как искать частичные слова, используя все поля этого индекса?

  1. У вас есть идеи для создания поискового запроса? поиск по множеству совпадений + части слова.

 {
      "shop_index": {
          "settings": {
              "index": {
                  "number_of_shards": "5",
                  "provided_name": "shop_index",
                  "creation_date": "1534235625279",
                  "analysis": {
                      "filter": {
                          "nGram_filter": {
                              "token_chars": [
                                  "letter",
                                  "digit",
                                  "punctuation",
                                  "symbol"
                              ],
                              "min_gram": "2",
                              "type": "nGram",
                              "max_gram": "20"
                          }
                      },
                      "analyzer": {
                          "nGram_analyzer": {
                              "filter": [
                                  "lowercase",
                                  "asciifolding",
                                  "nGram_filter"
                              ],
                              "type": "custom",
                              "tokenizer": "whitespace"
                          },
                          "whitespace_analyzer": {
                              "filter": [
                                  "lowercase",
                                  "asciifolding"
                              ],
                              "type": "custom",
                              "tokenizer": "whitespace"
                          }
                      }
                  },
                  "number_of_replicas": "1",
                  "uuid": "SBB9u344RVGm1QQUo-rVMg",
                  "version": {
                      "created": "6030299"
                  }
              }
          }
      }
    }

  1. отображение

{
      "shop_index": {
          "mappings": {
              "products": {
                  "properties": {
                      "html_keywords": {
                          "type": "text"
                      },
                      "html_title": {
                          "type": "text"
                      },
                      "name": {
                          "type": "text"
                      }
                  }
              }
          }
      }
    }

  1. I would want to search phrase like -> searching "HOUSE"
    • typing -> "ho" -> show me "HOUSE"
    • набрав -> "хоу" -> покажи мне "ДОМ"
    • ввод -> "использовать" -> покажи мне "ДОМ
    • набрав -> "se" -> покажи мне "ДОМ"

person Olejs    schedule 14.08.2018    source источник


Ответы (1)


Вы можете добиться этого с помощью нечеткого запроса - https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html. Также подумайте о том, чтобы объединить его с slop (насколько разрешены термины друг от друга) и используйте multi_match для поиска в нескольких полях.

Пример запроса:

{
    "query":
    {
        "multi_match":
        {
            "fields": ["field1", "field2"],
            "query": "hous",
            "slop": 3,
            "fuzziness": "AUTO"
        }
    }
}
person Jose    schedule 16.08.2018
comment
извините, но у меня это не работает, ищет только целые слова из проиндексированных полей - person Olejs; 16.08.2018
comment
Нечеткость в первую очередь предназначена для устранения орфографических ошибок, и вы можете попытаться настроить ее, изменив AUTO на число в соответствии с вашими требованиями. Более подробная информация доступна здесь — elastic.co/ руководство/en/elasticsearch/reference/current/. Также взгляните на подсказку завершения и проверьте, соответствует ли она вашим потребностям - elastic.co/guide/en/elasticsearch/reference/current/ - person Jose; 16.08.2018