gpt4 book ai didi

elasticsearch - 在 ElasticSearch 中查询匹配部分单词

转载 作者:行者123 更新时间:2023-11-29 02:51:07 33 4
gpt4 key购买 nike

我正在尝试在 ElasticSearch 中编写一个查询,该查询匹配单词中的连续字符。因此,如果我的索引包含“John Doe”,我应该仍会看到 Elasticsearch 针对以下搜索返回的“John Doe”。

  1. 小李
  2. 约翰·杜
  3. 哦哦
  4. 约翰
  5. 母鹿

到目前为止,我已经尝试过以下查询。

{
"query": {
"multi_match": {
"query": "term",
"operator": "OR",
"type": "phrase_prefix",
"max_expansions": 50,
"fields": [
"Field1",
"Field2"
]
}
}
}

但这也会返回不必要的匹配项,例如当我键入 john x 时我仍然会得到“John Doe”。

最佳答案

正如我在上面的评论中所解释的,随着索引的增长,应该不惜一切代价避免使用前缀通配符,因为这将迫使 ES 进行完整的索引扫描。我仍然相信 ngrams(更准确地说是 edge-ngrams)是可行的方法,所以我在下面尝试一下。

想法是索引输入的所有后缀,然后使用 prefix query匹配任何后缀,因为搜索前缀不会遇到与搜索后缀相同的性能问题。所以想法是索引 john doe 如下:

john doe
ohn doe
hn doe
n doe
doe
oe
e

这样,使用prefix 查询,我们可以匹配这些标记的任何子部分,从而有效地实现匹配部分连续词的目标,同时确保良好的性能。

索引的定义如下:

PUT my_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": [
"lowercase",
"reverse",
"suffixes",
"reverse"
]
}
},
"filter": {
"suffixes": {
"type": "edgeNGram",
"min_gram": 1,
"max_gram": 20
}
}
}
}
},
"mappings": {
"doc": {
"properties": {
"name": {
"type": "text",
"analyzer": "my_analyzer",
"search_analyzer": "standard"
}
}
}
}
}

然后我们可以索引一个示例文档:

PUT my_index/doc/1
{
"name": "john doe"
}

最后,以下所有搜索都将返回 john doe 文档:

POST my_index/_search 
{
"query": {
"prefix": {
"name": "john doe"
}
}
}

POST my_index/_search
{
"query": {
"prefix": {
"name": "john do"
}
}
}

POST my_index/_search
{
"query": {
"prefix": {
"name": "ohn do"
}
}
}

POST my_index/_search
{
"query": {
"prefix": {
"name": "john"
}
}
}

POST my_index/_search
{
"query": {
"prefix": {
"name": "n doe"
}
}
}

关于elasticsearch - 在 ElasticSearch 中查询匹配部分单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50478023/

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