我正在尝试搜索作为给定单词的子集的单词。例如,如果我搜索单词“ localhost.testsite.com”,则应该得到包含“ testsite.com”的结果。我知道我们可以使用通配符反之亦然,但是很难找到符合我要求的示例。
这就是我要尝试的:
GET domains/_search
{
"from": 0," size": 25,
"query":
{
"bool":
{
"must": [
{
"match": {
"domain": "localhost.testsite.com"
}
}
]
}
}
}
但这与整个单词匹配。有人知道如何查询以便检查“ testsite.com”之类的子集吗?
答案 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
}
]
}
现在,由于您的文档同时包含testsite
和com
标记,因此它将出现在搜索结果中。
让我知道您是否需要任何帮助来了解这一点。
编辑:-一些用于了解分析过程的链接https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html