query_string vs elasticsearch中的组匹配

时间:2013-11-12 19:00:21

标签: elasticsearch

此类查询之间有什么区别:

"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 个答案:

答案 0 :(得分:6)

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

请记住,query_string支持lucene query syntax:AND和OR运算符,查询特定字段,通配符,短语查询等因此需要对其进行解析,我不认为这里在性能方面有很大不同,但它容易出错并可能导致错误。如果您不需要所有这些功能,请坚持匹配查询,如果您想在多个字段上执行相同的查询,请查看multi_match query,它执行您对query_string执行的操作但是会进行翻译内部到多个匹配查询。

此外,如果您比较多个匹配查询的输出并且您的query_string可能完全不同,则返回得分。使用bool查询可以有效地构建lucene布尔查询,而query_string默认使用"use_dis_max":"true",这意味着它默认在内部使用dis_max query。使用multi_match查询也是如此。如果将use_dis_max设置为false,则将在内部使用bool查询。

答案 1 :(得分:0)

我的性能方面,我会说第二个查询会有性能优势,因为第一个查询需要分析所有四个match部分的查询字符串,而在第二个查询中只有一个查询需要分析的字符串。

除此之外,您可以查看here上的一些比较。

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