elasticsearch elasticsearch如何从其索引中提取和查询运算符,elasticsearch,indexing,lucene,query-optimization,elasticsearch,Indexing,Lucene,Query Optimization" /> elasticsearch elasticsearch如何从其索引中提取和查询运算符,elasticsearch,indexing,lucene,query-optimization,elasticsearch,Indexing,Lucene,Query Optimization" />

elasticsearch elasticsearch如何从其索引中提取和查询运算符

elasticsearch elasticsearch如何从其索引中提取和查询运算符,elasticsearch,indexing,lucene,query-optimization,elasticsearch,Indexing,Lucene,Query Optimization,假设我在两个不同的索引字段上的elasticsearch中有一个AND/MUST运算符查询 详情如下: "bool": { "must": [ { "match" : { "query": "Will", "fields": [ "first",], "minimum_should_match": "100%" // assuming this is q1

假设我在两个不同的索引字段上的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在幕后使用lucene。在lucene中,查询返回一个记分器,该记分器负责返回与查询匹配的文档列表

您的布尔查询将在内部转换为lucene
BooleanQuery
,在本例中,它将返回
connectionscorer
,因为它只有
must
子句

每一个子句都是一个
TermQuery
,它返回一个
TermScorer
,当高级时,它会按文档id的递增顺序给出下一个匹配文档

connectionscorer
只需依次推进每个计分器,即可计算计分器为每个子句返回的匹配文档的交集

因此,您可以将
TermScorer
想象成一个返回文档有序列表的人,将
connectionscorer
想象成一个简单地与两个有序列表相交的人


你没什么办法优化它。也许,因为你对分数不太感兴趣,你可以使用过滤查询,让ElasticSearch缓存它。

@soulcheck…谢谢你提供的信息,这对术语查询很有帮助,过滤器在执行缓存时会有所帮助……如果可能的话,您可以提供两个过滤器的交集如何工作的详细信息吗?@PrannoyMittal查找匹配文档是完全相同的-请记住,在lucene中,过滤器只是不参与评分的查询(lucene从5.x开始建议使用TermQuery实现术语过滤器)例如,这是lucene 5.4.0中的
TermFilter
构造函数:
publictermfilter(Term){super(newtermquery(Term));}