我正在遵循ES教程,有时在过滤器中使用term
编写了一个查询,而不是使用match
的推荐解决方案。我的理解是,在查询部分使用match
进行评分,而在term
部分使用filter
只是在进入查询部分之前删除匹配。令我惊讶的是,match
在filter
部分中也起作用。
两者之间有什么区别
GET blogs/_search
{
"query": {
"bool": {
"filter": {
"match": {
"category.keyword": "News"
}
}
}
}
}
和:
GET blogs/_search
{
"query": {
"bool": {
"filter": {
"term": {
"category.keyword": "News"
}
}
}
}
}
两者均返回相同的匹配,所有匹配的得分均为0。
filter子句的行为或match
是什么?我希望它能产生一些得分,但不会。
我的想法:
term
:不分析参数或字段,这是yes/no
方案。match
:分析参数和字段,并计算出它们的匹配程度得分。但是当在查询的match
部分中对keyword
使用filter
时,它的表现如何?
答案 0 :(得分:1)
match
查询是一个高级查询,如果需要,可以使用term
查询。
计分与使用match
而非term
无关。使用bool/must/should
instead of bool/filter
时得分会提高。
match
查询的工作方式如下:
首先,它检查字段的类型。
text
字段,则将使用查询中指定的分析器(如果有)或映射中指定的搜索时间或索引时间分析器来分析值。keyword
字段(例如您的情况),则不会分析输入并按“原样”进行输入由于您在match
字段上使用keyword
查询,并且您的输入是单个术语,因此不会分析任何内容,并且match
查询将诉诸于使用{{1}在下面查询。这就是为什么您看到相同结果的原因。
通常,最好使用term
查询,因为它足够聪明,可以根据给定的查询字段和要搜索的输入数据知道要做什么。
您可以详细了解两个here之间的区别。