Использование подстановочного знака Elasticsearch - PullRequest
0 голосов
/ 06 сентября 2018

Задача

При выполнении запроса с использованием подстановочных знаков дляasticsearch ожидаемые результаты не возвращаются.

Чтобы повторить проблему:

Версия 5.5.1

Создать индекс

PUT / пример-тест /

{
  "mappings": {
    "Change": {
      "properties": {
        "id": {
          "type": "keyword"
        },
        "searchProperties": {
          "type": "nested",
          "properties": {
            "key": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "value": {
              "type": "text",
              "analyzer": "standard"
            }
          }
        }
      }
    }
  }
}

Добавить документ в указатель

POST / example-test / Change / 01_MEP_01

{
  "id": "01_MEP_01",  
  "searchProperties": [
    {
      "key": "a.x",
      "value": "You take the red pill you stay in Wonderland, and I show you how deep the rabbit hole goes"
    }
  ]
}

Просмотр документа в индексе

GET / пример-тест / изменение / _search

Выполнить запрос

POST / example-test / Change / _search

{      
  "query": {
    "bool": {
      "must": [        
        {
          "query_string": {
            "query": "you ta",
            "default_operator": "and",
            "allow_leading_wildcard": true,
            "analyze_wildcard": true,
            "fields": [
              "_all"
            ]
          }
        }
      ]
    }
  }
}

С этого момента я просто укажу часть запроса «запрос». Я запустил это для нескольких примеров:

+-------------------+-------+
|       Query       | Found |
+-------------------+-------+
| you ta            | false |
| you ta*           | true  |
| you take*         | true  |
| land              | false |
| *land*            | true  |
| *land,*           | false |
| *land,            | false |
| wonderland        | true  |
| wonderland,       | true  |
| wonderlan*,       | false |
| \\*wonderland,\\* | true  |
+-------------------+-------+

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

Другой вариант - обеспечить поиск по групповым полям в самой строке запроса (должным образом экранируя знак *)

Это только при указании имен полей в запросе?

Вопрос

Если я хочу, чтобы мои пользователи могли искать «землю» и возвращать документ (так как он содержит слово «страна чудес»), как мне нужно использовать символы подстановки для возврата моего документа?

Дополнительная информация

Может показаться, что запятая вызывает здесь проблему. Это кажется странным. Просмотрите токены, сгенерированные с помощью команды:

POST / example-test / _analyze

{
  "analyzer": "standard",
  "text": "You take the red pill you stay in Wonderland, and I show you how deep the rabbit hole goes"
}

Мы можем видеть "Страну Чудес", в результате которой появляется символ "Страна Чудес". Насколько я понимаю, запрос будет проходить через тот же анализатор (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html),, поэтому должен приводить к тому же токену? Похоже, это не так?

...