我是弹性搜索领域的新手,因为我最近刚从Solr离职。我现在正试图将solrconfig中的edismax查询转换为使用弹性搜索。
基本上,我希望同时在两个字段中搜索术语,所以我最终得到了这个查询:
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"field_1": {
"query": "term1"
}
}
},
{
"match": {
"field_2": {
"query": "term1"
}
}
}
]
}
}
}
这适用于单个术语。如果有多个术语,则不需要找到每个术语。但是,我找不到实现此功能的方法。这就是minimum_should_match参数的作用——它由bool查询提供。
假设我有三个术语,我希望至少找到其中的两个。通过试错,我检查了很多变体,包括这样的东西:
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"field_1": {
"query": "term1 term2 nonexistingterm",
"operator": "and",
"minimum_should_match": 2
}
}
},
{
"match": {
"field_2": {
"query": "term1 term2 nonexistingterm",
"operator": "and",
"minimum_should_match": 2
}
}
}
]
}
}
}
但是minimum_should_match
在这里不起作用,并且由于and
运算符,没有找到结果。它不适用于or
,因为只有一次命中就足以返回结果。
有人能帮我把dis_max
和minimum should match
结合起来吗?
我找不到任何关于这方面的文档,所以我可以在elasticsearch中找到这些信息的任何提示都非常感谢!
您使用的是operator: and
,同时还提供了minimum_should_match
,这并不完全有意义。有了operator: and
,它产生了一个类似于的查询
field1:term1 AND field1:term2 AND field1:nonexistingterm
因此,无论minimum_should_match
设置为什么,所有这些都是必需的。为了有效利用最小应匹配行为,您需要生成带有"或"运算符的应子句。这就像删除operator
设置一样简单,因为"或"是默认值,您应该可以看到您要查找的行为。即:
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"field_1": {
"query": "term1 term2 nonexistingterm",
"minimum_should_match": 2
}
}
},
{
"match": {
"field_2": {
"query": "term1 term2 nonexistingterm",
"minimum_should_match": 2
}
}
}
]
}
}
}