我是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"
答案 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": {...}
}
}
根据您存储名称和地址的方式,您可能会得到更多结果。
希望这有帮助!