我尝试在ElasticSearch中编写一个查询,它匹配单词中的连续字符。因此,如果我的索引有“John Doe”,我仍然应该看到Elasticsearch在下面的搜索中返回“John Doe”。
1.无名氏
1.约翰杜
1.翁岛
1.约翰
- n母鹿
到目前为止,我已经尝试了以下查询。
{
"query": {
"multi_match": {
"query": "term",
"operator": "OR",
"type": "phrase_prefix",
"max_expansions": 50,
"fields": [
"Field1",
"Field2"
]
}
}
}
但这也会返回不必要的匹配,比如当我键入john x时,我仍然会得到“John Doe”。
3条答案
按热度按时间woobm2wo1#
正如我在上面的评论中所解释的,随着索引的增长,应该不惜一切代价避免使用前缀通配符,因为这将迫使ES进行全索引扫描。我仍然相信ngram(更准确地说是edge-ngram)是可行的方法,所以我在下面尝试一下。
其思想是索引输入的所有后缀,然后使用
prefix
query匹配任何后缀,因为搜索前缀不会遇到与搜索后缀相同的性能问题。因此,其思想是索引john doe
,如下所示:这样,使用
prefix
查询,我们可以匹配这些标记的任何子部分,这有效地实现了匹配部分连续单词的目标,同时确保了良好的性能。索引的定义如下:
然后我们可以索引一个示例文档:
最后,以下所有搜索都将返回
john doe
文档:46qrfjad2#
这对我来说是有效的。代替一个ngram,索引你的数据作为关键字。并使用通配符正则表达式匹配来匹配单词。
zd287kbt3#
以下是更新的修复程序
link to the code
more options with tokenizers
创建索引