Elasticsearch查询,其中字段提供结果子集

时间:2016-01-10 14:36:40

标签: elasticsearch

我是Elasticsearch的新手。这就是我的文档的样子:

_source : 
{

"name": "this is my title",
"address" : "1300 S Belmont Road"
"ID= : 54000"
}

当我运行此查询时:

查询1:

"query": {
   "filtered": {
      "query": {
         "query_string": {
            "query": "*Belmont*",
            "fields": ["name^5", "address^4","ID^3"]
         }
      },
      "filter": {...}
   }
}

我得到51个结果

查询2:

但是这个给出了123个结果:

"query": {
   "filtered": {
      "query": {
         "query_string": {
            "query": "*Belmont*",
                    }
      },
      "filter": {...}
   }
}

为什么查询会给出不同的结果,即使我在查询1中的所有字段上运行查询

映射:

地址和名称都是字符串和" not_analyzed"

1 个答案:

答案 0 :(得分:1)

这是因为_all field的工作方式。您的第一个查询是在指定字段中查找具有特定分析器荣誉*Belmont*。它在内部转换为bool查询,并分别与每个字段匹配。

由于地址为not_analyzed 1300 S Belmont Road 将按原样存储,但_all字段将使用标准分析器应用空格分隔字,如 1300 s belmont 等。来自Doc

  

_all字段是一个特殊的catch-all字段,用于连接   将所有其他字段的值转换为一个大字符串,使用空格作为   分隔符,然后进行分析和索引,但不进行存储。

因此,您的第二个查询会在_all字段上运行,并为您提供更多结果。

此外,您的第一个查询不会匹配"address" : "1300 S Belmont Road",默认情况下使用wildcard时会lowercased,因此会搜索belmont而不会找到它。您可以使用lowercase_expanded_terms更改此行为,默认情况下为true。试试这个

"query": {
   "filtered": {
      "query": {
         "query_string": {
            "query": "*Belmont*",
            "fields": ["name^5", "address^4","ID^3"],
            "lowercase_expanded_terms" : false
         }
      },
      "filter": {...}
   }
}

根据您存储名称和地址的方式,您可能会得到更多结果。

希望这有帮助!