我刚刚从Solr切换到弹性搜索中。我现在正尝试从我的solrconfig转换edismax查询以使用elasticsearch。
基本上我希望一次在两个字段中搜索这些术语,所以我最终得到了这个查询:
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"field_1": {
"query": "term1"
}
}
},
{
"match": {
"field_2": {
"query": "term1"
}
}
}
]
}
}
}
单个术语可以正常使用。如果是多个术语,则不需要找到每个术语。但是,我找不到实现此功能的方法。这就是minimum_should_match参数的用途 - 由bool query提供。
假设我有三个术语,我希望找到至少两个术语。通过反复试验我检查了很多变种,包括:
{
"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中找到这些信息的任何提示都非常感谢!
答案 0 :(得分:1)
您正在使用operator: and
并提供minimum_should_match
,但这并不完全合理。使用operator: and
,它会生成如下查询:
field1:term1 AND field1:term2 AND field1:nonexistingterm
因此,无论您minimum_should_match
的设置是什么,所有这些都是必需的。要有效地使用最小匹配行为,您需要使用“或”运算符生成should子句。这就像删除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
}
}
}
]
}
}
}