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"              
        ]
      }
    }
  ]
}}

性能,相关性?

提前致谢!

4

2 回答 2

6

查询的分析取决于字段分析器(除非您在查询本身中指定分析器),因此使用单个查询查询多个字段并不一定意味着只分析一次查询。

请记住,query_string支持lucene 查询语法:AND 和 OR 运算符,查询特定字段,通配符,短语查询等,因此需要对其进行解析,我认为这在性能方面没有太大区别, 但它很容易出错并可能导致错误。如果您不需要所有这些功能,请坚持使用匹配查询,如果您想在多个字段上执行相同的查询,请查看multi_match 查询,它与您对 query_string 所做的一样,但在内部转换为多个匹配查询。

此外,如果您比较多个匹配查询的输出和您的 query_string,返回的分数可能会有很大不同。使用 bool 查询可以有效地构建一个 lucene 布尔查询,而query_string 默认"use_dis_max":"true"使用,这意味着它默认使用内部dis_max 查询。使用 multi_match 查询也会发生同样的情况。如果您设置use_dis_max为 false,则将在内部使用 bool 查询。

于 2013-11-13T11:52:05.813 回答
0

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

除此之外,您可以在这里查看一些比较。

我不太确定相关性差异,但您始终可以触发这两个查询,看看获取的结果是否存在相关性差异。

于 2013-11-13T05:18:19.670 回答