您好我有以下对象:
{
type:'foo'
users: [{id: MyId roles:['Admin','FooAdmin']},
{id: MyId2 roles:['Admin']}]
}
我正在使用bool查询通过用户ID获取此对象。使用以下术语:
'term': {
'users.id': 'myId'
}
除非id中包含大写字母,否则效果很好。我搜索了一下,发现匹配查询作为替代:
{
"query":
{
"match":
{
"users.userId":token._source.userId
}
}
}
到目前为止,它一直很适合我,因为它区分大小写。但最近我听说匹配查询只获得了最好的结果,这意味着只能获得得分最高的结果。这是真的?我冒险不通过匹配查询获得我想要的所有对象吗?
答案 0 :(得分:1)
匹配查询采用查询字符串analyzes it,然后将分析的标记转换为OR查询。原因是它区分大小写是因为分析仪中有lowercase filter。
所以像
这样的查询字符串 "brown dog"
会变成两个令牌和小写,类似
[brown] OR [dog]
这将根据这两个术语的相关性检索和排名结果。相关性公式本身就很复杂,但是您只需获得相关的所有结果。
参数minimum_should_match例外,如果设置了此参数,则可以控制上面OR查询中必须匹配的文档中的文档数量。但是,这默认为1,因此它不会对您产生影响。
如果你想要精确的字符串匹配但没有这种标记化业务的小写,你可以创建一个自定义分析器,将KeywordTokenizer(基本上没有标记器)和小写过滤器串在一起。