gpt4 book ai didi

elasticsearch - Elasticsearch检查单词的子集是否存在

转载 作者:行者123 更新时间:2023-12-02 22:55:23 24 4
gpt4 key购买 nike

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

这是我正在尝试的:

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

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

最佳答案

您需要创建一个自定义分析器,该分析器使用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的字段创建 token
{
"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 token ,因此它将出现在搜索结果中。

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

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

关于elasticsearch - Elasticsearch检查单词的子集是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56592499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com