ElasticSearch检查单词的子集是否存在

时间:2019-06-14 06:21:25

标签: elasticsearch

我正在尝试搜索作为给定单词的子集的单词。例如,如果我搜索单词“ localhost.testsite.com”,则应该得到包含“ testsite.com”的结果。我知道我们可以使用通配符反之亦然,但是很难找到符合我要求的示例。

这就是我要尝试的:

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

但这与整个单词匹配。有人知道如何查询以便检查“ testsite.com”之类的子集吗?

1 个答案:

答案 0 :(得分:3)

您需要创建一个自定义分析器,该分析器使用char filter.替换为space

以下是用于创建上述分析器的设置。您可以使用analyze 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
        }
    ]
}

现在,由于您的文档同时包含testsitecom标记,因此它将出现在搜索结果中。

让我知道您是否需要任何帮助来了解这一点。

编辑:-一些用于了解分析过程的链接https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html