假设我有以下索引结构:
{
"title": "Early snow this year",
"body": "After a year with hardly any snow, this is going to be a serious winter",
"source": [
{
"name":"CNN",
"details": {
"site": "cnn.com"
}
},
{
"name":"BBC",
"details": {
"site": "bbc.com"
}
}
]
}
我有一个bool查询试图在这里检索这个文件:
{
"query": {
"bool" : {
"must" : {
"query_string" : {
"query" : "snow",
"fields" : ["title", "body"]
}
},
"filter": {
"bool": {
"must" : [
{ "term" : {"source.name" : "bbc"}},
{ "term" : {"source.details.site" : "BBC.COM"}}
]
}
}
}
}
}'
但它没有使用零点击,我应该如何修改我的查询?它仅在我删除{ "term" : {"source.details.site" : "BBC.COM"}}
时才有效。
以下是映射:
{
"news" : {
"mappings" : {
"article" : {
"properties" : {
"body" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"source" : {
"properties" : {
"details" : {
"properties" : {
"site" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
}
答案 0 :(得分:0)
您正在" source.details.site"上进行术语查询。术语查询表示在查询时不会分析您提供的值。如果您使用默认映射,那么source.details.site将是小写的。现在当你用term和" BBC.COM"," BBC.COM"不会被分析,ES正试图匹配" BBC.COM"与" bbc.com" (因为它在索引时间是小写的)并且结果是错误的 您可以使用匹配而不是术语来分析它。但是最好在关键字字段上使用术语查询,事先就知道要编入索引的确切内容。术语查询具有从ES端缓存的优点,并且比匹配查询更快。
您应该在索引时清理数据,因为您将编写一次并始终阅读。所以像" /"," http"如果你没有丢失语义,应该删除。您可以在编制索引时通过代码实现此目的,也可以在映射中创建自定义analysers。但请记住,自定义分析仪不会在关键字字段上工作。因此,如果您尝试在ES端实现此功能,则无法在不启用字段数据的情况下对该字段进行聚合,应该避免这种情况。我们在最新更新中为标准化者提供了实验性支持,但由于它是实验性的,因此不要在生产中使用它。因此,在我看来,您应该清理代码中的数据。