1

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

这是我正在尝试的:

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

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

4

1 回答 1

2

您需要创建一个自定义分析器,该分析器使用char 过滤.器将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
        }
    ]
}

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

如果您需要任何帮助来理解这一点,请告诉我。

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

于 2019-06-14T08:00:18.153 回答