Elasticsearch中的query_string和group match有什么区别?

4
这两个查询有什么区别:

"query": {
"bool": {
 ...
  "should": [
    {
      "match": {
        "description": {
          "query": "test"              
        }
      }
    },
    {
      "match": {
        "address": {
          "query": "test",              
        }
      }
    },
    {
      "match": {
        "country": {
          "query": "test"              
        }
      }
    },
    {
      "match": {
        "city": {
          "query": "test"
        }
      }
    }        
  ]
}}

还有这个:

"query": {
"bool": {
 ...      
  "should": [        
    {
      "query_string": {
        "query": "test",
        "fields": [
          "description",
          "address",
          "country",
          "city"              
        ]
      }
    }
  ]
}}

性能,相关性?

提前致谢!

2个回答

6
查询会根据字段分析器进行分析(除非您在查询本身中指定了分析器),因此使用单个查询查询多个字段并不一定意味着只分析一次查询。请注意,query_string 支持lucene查询语法:AND 和 OR 运算符,对特定字段进行查询,通配符、短语查询等,因此需要解析它,这在性能方面可能没有太大的差别,但容易出错,并可能导致错误。如果您不需要所有这些功能,请使用匹配查询,如果您想在多个字段上执行相同的查询,请查看multi_match 查询,它可以做到您使用 query_string 所做的事情,但内部转换为多个匹配查询。另外,如果您比较多个匹配查询和您的 query_string 的输出,返回的分数可能会有很大不同。使用布尔查询,您有效地构建了一个 Lucene 布尔查询,而 query_string 默认使用 "use_dis_max": "true",这意味着它默认使用内部的dis_max 查询。使用 multi_match 查询也是如此。如果将 use_dis_max 设置为 false,则内部将使用布尔查询。

谢谢,multi_match查询确实适用于这种情况。我需要深入阅读手册 :) - Ievgen Martynov

0

就性能而言,我认为第二个查询将具有性能优势,因为第一个查询需要分析所有四个match部分的查询字符串,而在第二个查询中只需要分析一个查询字符串。

除此之外,还可以比较这里的一些内容。

我不确定相关性差异,但您可以始终执行这两个查询,并查看从获取的结果中是否存在任何相关性差异。


1
实际上,查询是根据字段分析器进行分析的,因此查询多个字段并不一定意味着仅分析一次查询。 - javanna
好的,我想我错过了那个,谢谢更新。 - aash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接