当前位置: 首页 > 知识库问答 >
问题:

将elasticsearch布尔查询与范围增强相结合

莫英喆
2023-03-14

将elasticsearch布尔查询与范围增强相结合

{
  "from": 0,
  "size": 10,
  "query": {
    "function_score": {
      "boost_mode": "replace",
      "query": {
        "filtered": {
          "filter": {
            # ...
          },
          "query": {
            "bool": {
              "should": [
                {
                  "match": {
                    "name.suggest_ngrams": {
                      "query": "dgbdrtgndgfndrtgb",
                      "fuzziness": "AUTO",
                      "prefix_length": 1,
                      "operator": "AND",
                      "boost": 10
                    }
                  }
                },
                {
                  "multi_match": {
                    "query": "dgbdrtgndgfndrtgb",
                    "fields": [
                      "name.untouched_lowercase"
                    ],
                    "boost": 5
                  }
                },
                {
                  "query_string": {
                    "fields": [
                      "name.suggest"
                    ],
                    "query": "dgbdrtgndgfndrtgb*",
                    "boost": 10
                  }
                },
                {
                  "query_string": {
                    "fields": [
                      "name.suggest"
                    ],
                    "query": "dgbdrtgndgfndrtgb",
                    "boost": 10
                  }
                },
                {
                  "match": {
                    "first_word": {
                      "query": "dgbdrtgndgfndrtgb",
                      "operator": "AND",
                      "boost": 10
                    }
                  }
                },
                {
                  "match": {
                    "name": {
                      "query": "dgbdrtgndgfndrtgb",
                      "operator": "AND",
                      "boost": 5
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}

因此,我尝试添加一个范围增强,如下所示:

{
  "from": 0,
  "size": 10,
  "query": {
    "function_score": {
      "boost_mode": "replace",
      "query": {
        "filtered": {
          "filter": {
            # ...
          },
          "query": {
            "bool": {
              "should": [
                {
                  "match": {
                    "name.suggest_ngrams": {
                      "query": "dgbdrtgndgfndrtgb",
                      "fuzziness": "AUTO",
                      "prefix_length": 1,
                      "operator": "AND",
                      "boost": 10
                    }
                  }
                },
                {
                  "multi_match": {
                    "query": "dgbdrtgndgfndrtgb",
                    "fields": [
                      "name.untouched_lowercase"
                    ],
                    "boost": 5
                  }
                },
                {
                  "query_string": {
                    "fields": [
                      "name.suggest"
                    ],
                    "query": "dgbdrtgndgfndrtgb*",
                    "boost": 10
                  }
                },
                {
                  "query_string": {
                    "fields": [
                      "name.suggest"
                    ],
                    "query": "dgbdrtgndgfndrtgb",
                    "boost": 10
                  }
                },
                {
                  "match": {
                    "first_word": {
                      "query": "dgbdrtgndgfndrtgb",
                      "operator": "AND",
                      "boost": 10
                    }
                  }
                },
                {
                  "match": {
                    "name": {
                      "query": "dgbdrtgndgfndrtgb",
                      "operator": "AND",
                      "boost": 5
                    }
                  }
                },
                { 
                  "range": {
                    "name.word_count": {
                      "lt": 2,
                      "boost": 40
                    }
                  }
                }               
              ]
            }
          }
        }
      }
    }
  }
}

这会像我想要的那样对内容进行排序,但它也会返回与搜索项DGBDRTGNDGFNDRTGB不匹配的单字匹配项。

有没有一种方法可以只增强单个单词的匹配,这些匹配也与搜索项匹配?我尝试降低boost值,当使用有效的(找到的)搜索项时,该值会破坏所需的排序

似乎应该有一种方法可以使用范围bool进行整个查询。我尝试了各种排列来实现这一点,但运气不好,文档也不太有用。

一个警告:我不能使用脚本,因为索引托管在AWS上,而AWS不支持它。

任何建议都很感激。


共有1个答案

蒋曾笑
2023-03-14

在沉睡了这个问题之后,我突然意识到这只是布尔逻辑。因此,我提出了一个非常有效的解决方案,其中我将工作查询逻辑包装在must标记中,并将rangeboost放在shoul标记中。

{
  "from": 0,
  "size": 10,
  "query": {
    "function_score": {
      "boost_mode": "replace",
      "query": {
        "filtered": {
          "filter": {
            # ...
          },
          "query": {
            "bool": {
              "must": {
                "bool": {
                  "should": [
                    {
                      "match": {
                        "name.suggest_ngrams": {
                          "query": "dgbdrtgndgfndrtgb",
                          "fuzziness": "AUTO",
                          "prefix_length": 1,
                          "operator": "AND",
                          "boost": 10
                        }
                      }
                    },
                    {
                      "multi_match": {
                        "query": "dgbdrtgndgfndrtgb",
                        "fields": [
                          "name.untouched_lowercase"
                        ],
                        "boost": 5
                      }
                    },
                    {
                      "query_string": {
                        "fields": [
                          "name.suggest"
                        ],
                        "query": "dgbdrtgndgfndrtgb*",
                        "boost": 10
                      }
                    },
                    {
                      "query_string": {
                        "fields": [
                          "name.suggest"
                        ],
                        "query": "dgbdrtgndgfndrtgb",
                        "boost": 10
                      }
                    },
                    {
                      "match": {
                        "first_word": {
                          "query": "dgbdrtgndgfndrtgb",
                          "operator": "AND",
                          "boost": 10
                        }
                      }
                    },
                    {
                      "match": {
                        "name": {
                          "query": "dgbdrtgndgfndrtgb",
                          "operator": "AND",
                          "boost": 5
                        }
                      }
                    }
                  ]
                }
              },
              "should": {
                "range": {
                  "name.word_count": {
                    "lt": 2,
                    "boost": 40
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

耶!

 类似资料:
  • 我在ES中有两个问题。对于同一组文档,两者的周转时间都不同。两者在概念上都在做同样的事情。我没有什么疑问 1-这两者之间有什么区别?2-哪个更好使用?3-如果两者相同,为什么表现不同? 映射: 更新1: 我在同一组数据上尝试了bool/必须查询和bool/过滤器查询,但我发现了奇怪的行为 1-bool/必须查询能够搜索所需的文档 2-虽然bool/filter无法搜索文档。如果我删除第二个字段条件

  • 我在这里遵循指南https://dzone.com/articles/23-usplient-ellasticsearch-example-queries,下面的bool查询让我感到困惑: 根据教程,查询的解释是: 搜索标题中有“ellasticsearch”或“solr”字样的书,由“Clinton Gormley”撰写,但不由“Radu Gheorge”撰写 我的问题是,bool查询中有3个条

  • 我使用bool查询的必须和must_not功能。它像预期的那样工作,直到我得到一个3级深的属性。 工作正常并返回结果,但如果我在bool查询中执行相同的操作,如。。 不返回任何结果。这是为什么?????记住其他bool查询,例如。。 干得很好!它只适用于任何3级深的字段,因此搜索任何1级深的术语。建议3。建议3

  • 可以对模型的查询和写入操作进行封装,例如: <?php namespace app\index\model; use think\Model; class User extends Model { public function scopeThinkphp($query) { $query->where('name','thinkphp')->field('i

  • 我对Bool查询和在elasticsearch中查找精确值有点困惑。具体来说,我有一个title_field和post_field,我想搜索。但是我使用的所有其他字段,因为我想查找它们是否存在或不存在,或者有多少次(如网址或用户名,必须是准确的)。 因此,我可以从文档中看到,我可以对title_字段和post_字段进行多重匹配查询。 但我希望得到确切答复的其他领域呢?我是否执行布尔查询(使用mus

  • 问题内容: 我正在用查询查询我的elasticsearch索引。查询本身的结构与此类似 我希望能够确定所有这些查询中哪一个是与结果匹配的查询。是否有内置的elasticsearch方法允许这样做,还是我必须手动进行? 问题答案: 您可以使用命名查询,然后在结果中获得匹配的查询的名称。 然后,在结果中,您将获得一个数组,其中包含与文档匹配的查询的名称。