В Elasticsearch как мне выполнить поиск по шаблону с пробелами?

#elasticsearch

#elasticsearch

Вопрос:

В настоящее время у меня есть массив объектов, который включает:

         {
          "key": "party",
          "str_val": "THE TWITTER INC"
        }
  

и

         {
          "key": "party",
          "str_val": "twitter inc"
        }
  

Соответствующая часть моего сопоставления:

           "key": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "str_val": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
  

Когда я пытаюсь выполнить сопоставление по шаблону следующим образом:

 "wildcard": {
    "metadata.str_val": "*twitter*"
}
  

возвращаются оба документа. Но если я изменю свой запрос, чтобы включить пробел:

 "wildcard": {
    "metadata.str_val": "*twitter inc*"
}
  

документы не возвращаются. Как мне выполнить поиск по шаблону с пробелами?

Ответ №1:

Вариант 1:

С вашим текущим отображением, т. е. без использования анализатора, query_string должен работать для вас.

 PUT my_index2/doc/1
{
  "key": "party",
  "str_val": "THE TWITTER INC"
}

PUT my_index2/doc/2
{
  "key": "party",
  "str_val": "twitter inc"
}

POST my_index2/_search
{
  "query": {
    "query_string": {
      "default_field": "str_val",
      "query": "*twitter inc*"
    }
  }
}
  

Вариант 2:

Однако, если вы хотите использовать подстановочный знак, вам необходимо добавить пользовательский анализатор, как показано ниже:

 PUT my_index/
{
  "settings": {
    "analysis": {
      "analyzer": {
        "k_lowercase": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
   "mappings": {
      "doc": {
        "properties": {
          "key": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }              
          },
          "str_val": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            },
             "analyzer":"k_lowercase"
          }
        }
      }
    }
}
  

Теперь добавьте записи после установки анализатора :

 PUT my_index/doc/1
{
  "key": "party",
  "str_val": "THE TWITTER INC"
}

PUT my_index/doc/2
{
  "key": "party",
  "str_val": "twitter inc"
}

POST my_index/_search
{
  "query": {
    "wildcard": {
      "str_val": {
        "value": "*twitter inc*"
      }
    }
  }
}