如何将弹性搜索中的短语与可扩展的前缀和后缀匹配?
How to match a phrase in elastic-search with expandable prefix and suffix?
我们有一个用例,我们想在 elastic-search 中匹配短语,但除了短语查询之外,我们还想搜索部分短语。
示例:
搜索词组:"welcome you" 或 "lcome you" 或 "welcome yo" 或 "lcome yo" 这应该匹配包含词组的文档:
"welcome you"
"we welcome you"
"welcome you to"
"we welcome you to"
即我们想通过执行具有附加功能的短语查询来维护单词的顺序,即 returns 我们的结果包含短语作为部分子字符串,并且前缀和后缀可扩展到特定的可配置长度。
在 elastic 中,我发现了类似 'match_phrase_prefix' 的东西,但它只匹配以特定前缀开头的短语。
Ex return 结果以 d 前缀开头:
$ curl -XGET localhost:9200/startswith/test/_search?pretty -d '{
"query": {
"match_phrase_prefix": {
"title": {
"query": "d",
"max_expansions": 5
}
}
}
}'
有什么方法可以让后缀也达到这个目的吗?
我强烈建议您查看 shingle
token filter。
您可以使用自定义分析器定义一个索引,该分析器利用带状疱疹来为一组后续标记以及标记本身编制索引。
curl -XPUT localhost:9200/startswith -d '{
"settings": {
"analysis": {
"analyzer": {
"my_shingles": {
"tokenizer": "standard",
"filter": [
"lowercase",
"shingles"
]
}
},
"filter": {
"shingles": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 2,
"output_unigrams": true
}
}
}
},
"mappings": {
"test": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_shingles"
}
}
}
}
}'
例如,we welcome you to
将被索引为以下标记
we
we welcome
welcome
welcome you
you
you to
to
然后你可以索引几个示例文档:
curl -XPUT localhost:9200/startswith/test/_bulk -d '
{"index": {}}
{"title": "welcome you"}
{"index": {}}
{"title": "we welcome you"}
{"index": {}}
{"title": "welcome you to"}
{"index": {}}
{"title": "we welcome you to"}
'
最后,您可以运行下面的查询来匹配上面的所有四个文档,如下所示:
curl -XPOST localhost:9200/startswith/test/_search -d '{
"query": {
"match": {"title": "welcome you"}
}
}'
请注意,此方法比 match_phrase_prefix
查询更强大,因为它允许您匹配文本正文中任何位置的后续标记,无论是开头还是结尾。
我们有一个用例,我们想在 elastic-search 中匹配短语,但除了短语查询之外,我们还想搜索部分短语。
示例:
搜索词组:"welcome you" 或 "lcome you" 或 "welcome yo" 或 "lcome yo" 这应该匹配包含词组的文档:
"welcome you"
"we welcome you"
"welcome you to"
"we welcome you to"
即我们想通过执行具有附加功能的短语查询来维护单词的顺序,即 returns 我们的结果包含短语作为部分子字符串,并且前缀和后缀可扩展到特定的可配置长度。 在 elastic 中,我发现了类似 'match_phrase_prefix' 的东西,但它只匹配以特定前缀开头的短语。
Ex return 结果以 d 前缀开头:
$ curl -XGET localhost:9200/startswith/test/_search?pretty -d '{
"query": {
"match_phrase_prefix": {
"title": {
"query": "d",
"max_expansions": 5
}
}
}
}'
有什么方法可以让后缀也达到这个目的吗?
我强烈建议您查看 shingle
token filter。
您可以使用自定义分析器定义一个索引,该分析器利用带状疱疹来为一组后续标记以及标记本身编制索引。
curl -XPUT localhost:9200/startswith -d '{
"settings": {
"analysis": {
"analyzer": {
"my_shingles": {
"tokenizer": "standard",
"filter": [
"lowercase",
"shingles"
]
}
},
"filter": {
"shingles": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 2,
"output_unigrams": true
}
}
}
},
"mappings": {
"test": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_shingles"
}
}
}
}
}'
例如,we welcome you to
将被索引为以下标记
we
we welcome
welcome
welcome you
you
you to
to
然后你可以索引几个示例文档:
curl -XPUT localhost:9200/startswith/test/_bulk -d '
{"index": {}}
{"title": "welcome you"}
{"index": {}}
{"title": "we welcome you"}
{"index": {}}
{"title": "welcome you to"}
{"index": {}}
{"title": "we welcome you to"}
'
最后,您可以运行下面的查询来匹配上面的所有四个文档,如下所示:
curl -XPOST localhost:9200/startswith/test/_search -d '{
"query": {
"match": {"title": "welcome you"}
}
}'
请注意,此方法比 match_phrase_prefix
查询更强大,因为它允许您匹配文本正文中任何位置的后续标记,无论是开头还是结尾。