我有一个弹性字段,其中包含一个用户名,例如。我的名字将包含john doe
。
我正在尝试创建一个匹配查询,以便能够通过以下短语找到我的名字:
john d
个john do
个doe
个
我的查询:
{
"bool" : {
"should" : [
{
"match" : {
"keywords" : {
"query" : "john do",
"operator" : "AND",
"prefix_length" : 0,
"max_expansions" : 50,
"minimum_should_match" : "50%",
}
}
}
]
}
}
字符串
问题是john
和john do
将找不到任何东西,因为AND
运算符。如果我切换到OR
,搜索john doe
实际上会选择数据库中的每一个john
,我的姓氏甚至不会出现在最上面的结果。
对于这样的搜索,查询应该如何形成?
2条答案
按热度按时间lb3vh1jj1#
你应该使用match phrase prefix query,在下面的示例上测试过,根据你的用例,它似乎工作得很好。
样本文件
字符串
使用匹配短语前缀搜索查询
型
7gyucuyw2#
我认为edge_ngrams应该在这种情况下工作。请尝试以下操作:
设置索引以使用edge_ngrams作为索引分析器。
字符串
然后使用以下查询查询索引:
型
解释:
edge ngram索引分析器将为索引中的name字段生成最小长度为1,最大长度为10的ngram
您可以使用以下命令检查令牌:
型
当你使用匹配查询搜索时,它会在你的文档中找到vojtech和k作为ngrams。
我的测试案例vojtech亚当斯,vojtech knyttl,vojtech,joe knyttl
如果我搜索vojtech knyttl它返回1结果。
如果我搜索vojtech,我会得到vojtech亚当斯,vojtech knyttl,vojtech
如果我搜索vojteck k我得到vojtech knyttl
如果我搜索knyttl我得到vojtech knyttl,乔knyttl