【问题标题】:How does elasticsearch fetch AND operator query from its indexeselasticsearch如何从其索引中获取AND运算符查询
【发布时间】:2016-07-20 18:58:59
【问题描述】:

假设我在 elasticsearch 中对两个不同的索引字段进行 AND/MUST 运算符查询 如下:

"bool": {
    "must": [
        {
          "match" : {
            "query":      "Will",
            "fields":     [ "first",],
            "minimum_should_match": "100%"  // assuming this is q1
          }
        },
        {
          "match" : {
            "query":      "Smith",
            "fields":     [ "last" ]
            "minimum_should_match": "100%" //assuming this is q2
          }
        }
    ]
}

现在我想知道弹性搜索如何在后台获取文档。 它是否会获取索引与 q1 匹配的所有文档的 id,然后遍历所有也具有索引 q2 的文档。

两组的交集是怎么做的?

如何索引我的数据以优化和查询两个单独的字段?

【问题讨论】:

    标签: elasticsearch indexing lucene query-optimization


    【解决方案1】:

    首先是一些基础知识:ElasticSearch 在幕后使用 lucene。在 lucene 中,查询返回一个记分器,该记分器负责返回与查询匹配的文档列表。

    您的布尔查询将在内部转换为 lucene BooleanQuery,在这种情况下将返回 ConjunctionScorer,因为它只有 must 子句。

    每个子句都是一个TermQuery,它返回一个TermScorer,在高级时,它会按照文档ID的升序给出下一个匹配的文档。

    ConjunctionScorer 通过简单地轮流推进每个记分器来计算记分器返回的每个子句的匹配文档的交集。

    因此,您可以将TermScorer 视为返回文档的有序列表,将ConjunctionScorer 视为与两个有序列表相交的一个。

    您无法优化它。也许,由于您对分数并不真正感兴趣,您可以使用过滤器查询并让 ElasticSearch 缓存它。

    【讨论】:

    • @soulcheck...感谢您提供的信息,它对术语查询很有帮助,过滤器在执行缓存时会有所帮助...。如果可能,您能否提供两个过滤器的交集如何工作的详细信息?
    • @PrannoyMittal 找到匹配的文档是完全一样的 - 请记住,在 lucene 中过滤器只是不参与评分的查询(从 5.x 开始的 lucene 建议使用 TermQuery 来实现术语过滤器)。
    • 例如,这是 lucene 5.4.0 中的 TermFilter 构造函数:public TermFilter(Term term) { super(new TermQuery(term)); }
    猜你喜欢
    • 2014-10-22
    • 2016-08-23
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多