ElasticSearch проверяет, существует ли подмножество слова - PullRequest
2 голосов
/ 14 июня 2019

Я пытаюсь найти слово, которое является подмножеством данного слова. Например, если я найду слово «localhost.testsite.com», я должен получить результаты с «testsite.com». Я знаю, что мы можем сделать наоборот с подстановочными знаками, но трудно найти пример с моим требованием.

Вот что я пытаюсь:

GET domains/_search
{
  "from": 0," size": 25,
    "query": 
    {
      "bool": 
      {
        "must": [
          {
            "match": {
              "domain": "localhost.testsite.com"
            }
          }
        ]
      }
    }
}

Но это соответствует всему слову. Кто-нибудь знает, как сделать запрос, чтобы он проверял подмножества, такие как "testsite.com"?

1 Ответ

3 голосов
/ 14 июня 2019

Вам необходимо создать собственный анализатор, который использует символ фильтра для замены . на space.

Ниже приведена настройка для создания вышеуказанного анализатора. Вы можете использовать анализ API для проверки этого.

{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "char_filter": [
                        "replace_dots"
                    ]
                }
            },
            "char_filter": {
                "replace_dots": {
                    "type": "mapping",
                    "mappings": [
                        ". => \\u0020"
                    ]
                }
            }
        }
    }
}

Этот анализатор создаст токены ниже для поля, содержащего testsite.com

{
    "tokens": [
        {
            "token": "testsite",
            "start_offset": 0,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "com",
            "start_offset": 9,
            "end_offset": 12,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

Теперь вам нужно использовать запрос match в том же поле, так как запрос на совпадение анализируется и использует тот же анализатор, поэтому для текста поиска localhost.testsite.com будут сгенерированы ниже токены.

{
    "tokens": [
        {
            "token": "localhost",
            "start_offset": 0,
            "end_offset": 9,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "testsite",
            "start_offset": 10,
            "end_offset": 18,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "com",
            "start_offset": 19,
            "end_offset": 22,
            "type": "<ALPHANUM>",
            "position": 2
        }
    ]
}

Теперь, когда ваш документ содержит токены testsite и com, он появится в результатах поиска.

Дайте мне знать, если вам нужна помощь в понимании этого.

РЕДАКТИРОВАТЬ: - Некоторые ссылки для понимания процесса анализа https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...