当我通过一个特定方面进行过滤时,该特定字段的方面在结果中被正确过滤,但其他方面的字段保持不变。解释这一点的最佳方法是使用查询和响应。
{
query: {
match_all: {}
},
filter: {
and: [{
term: {
"address.state": "oregon"
}
}]
},
facets: {
"address.city": {
terms: {
field: "address.city"
},
facet_filter: {}
},
"address.state": {
terms: {
field: "address.state"
},
facet_filter: {
and: [{
term: {
"address.state": "oregon"
}
}]
}
},
"address.country": {
terms: {
field: "address.country"
},
facet_filter: {}
}
}
}
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "races",
"_type": "race",
"_id": "6",
"_score": 1,
"_source": {
"id": 6,
"name": "Eugene Marathon",
"description": "...",
"created_at": "2015-05-24T19:41:45.043Z",
"updated_at": "2015-05-24T19:41:45.046Z",
"address": {
"race_id": 6,
"id": 7,
"line1": null,
"line2": null,
"city": "Eugene",
"state": "oregon",
"country": "united_states",
"zip": null,
"user_id": null,
"created_at": "2015-05-24T19:41:45.044Z",
"updated_at": "2015-05-24T19:41:45.044Z"
},
"race_years": []
}
}
]
},
"facets": {
"address.city": {
"_type": "terms",
"missing": 0,
"total": 7,
"other": 0,
"terms": [
{
"term": "long beach",
"count": 1
},
{
"term": "lincoln",
"count": 1
},
{
"term": "las vegas",
"count": 1
},
{
"term": "jackson",
"count": 1
},
{
"term": "eugene",
"count": 1
},
{
"term": "duluth",
"count": 1
},
{
"term": "denver",
"count": 1
}
]
},
"address.state": {
"_type": "terms",
"missing": 0,
"total": 1,
"other": 0,
"terms": [
{
"term": "oregon",
"count": 1
}
]
},
"address.country": {
"_type": "terms",
"missing": 0,
"total": 7,
"other": 0,
"terms": [
{
"term": "united_states",
"count": 7
}
]
}
}
}
因此,如您所见,它返回所有address.city
方面,即使唯一的结果位于Eugene。它还返回united_states
的计数7。为什么它会返回所有这些额外的方面和错误的计数?下面是我的ruby映射。
settings index: {
number_of_shards: 1,
analysis: {
analyzer: {
facet_analyzer: {
type: 'custom',
tokenizer: 'keyword',
filter: ['lowercase', 'trim']
}
}
}
} do
mapping do
indexes :name, type: 'string', analyzer: 'english', boost: 10
indexes :description, type: 'string', analyzer: 'english'
indexes :address do
indexes :city, type: 'string', analyzer: 'facet_analyzer'
indexes :state, type: 'string'
indexes :country, type: 'string'
end
end
end
这是针对筛选器运行时小面的正常行为。来自官方文件:
有一个重要的区别需要记住。虽然搜索查询同时限制返回的文档和方面计数,但搜索筛选器只限制返回的文档,而不限制方面计数。
在您的示例中,您的查询匹配所有文档(即match_all
),因此方面计数也针对所有文档进行计数。
将您的查询更改为此,您的方面计数将会改变(在本例中,您不再需要facet_filter
):
{
query: {
term: {
"address.state": "oregon"
}
},
facets: {
"address.city": {
terms: {
field: "address.city"
}
},
"address.state": {
terms: {
field: "address.state"
}
},
"address.country": {
terms: {
field: "address.country"
}
}
}
}
另一件值得注意的事情是,方面是不推荐的,已经被更强大的聚合所取代。
问题内容: 我有一个列表,数组或您熟悉的任何一种语言。例如,names:如果与这些名称之一匹配,我想查询该字段。 一种方法是使用OR过滤器。例如 有什么更好的办法吗?如果它是查询,则比过滤器更好。 问题答案: 哪一个Elasticsearch会像您曾经使用过的那样重写 在大多数情况下,使用布尔型过滤器时,使用过滤器比或更好。原因在Elasticsearch博客中进行了解释:http://www.e
问题内容: 如何通过所有多词搜索仅获取经过过滤的匹配结果。我有这个示例表,其中titleid是一个映射int字段,personid是一个关键字: 删除结果为: 使用这样的示例查询: 我得到以下结果: 也许这会有所帮助,我在sql中进行了查询并获得了预期的结果。我所做的是让查询给我与搜索到的参数数量匹配的titleid之和。这只是为了更多地自我解释,其思想是使用elasticsearch。 问题答案
在Elasticsearch中,是否有任何方法可以将与特定查询/筛选器不匹配的嵌套对象从结果源中排除? 例如,假设一个文档在一个嵌套字段中有四个对象。查询所需的筛选器只会导致匹配对象1和3。当我们通过_source获得结果时,我们将拉回整个文档以及对象1、2、3、4。 有可能从结果中排除对象2和4吗?或者是我们必须使用应用程序端逻辑重新迭代并排除的东西?
我有一个C#代码,使用Elastic搜索类型,它将匹配两个字段。我用的是NEST软件包。 问题是,无论我传入什么文本,它都会返回所有结果。我错过了什么?
我想同时执行精确的单词匹配和部分单词/子字符串匹配。例如,如果我搜索“test product”,那么我应该能够在结果中找到“test”和“product”相关的文本。我用下面的match查询搜索弹性搜索,它不是给我精确的匹配,而是给我一些更多的不确定的匹配。示例是在结果中给出与“sample”相关的文本。 我使用弹性搜索6.3 请在下面找到我的查询 搜索结果:“Hits”:[{“_index”:
我和ElasticSearch一起工作。当我执行此查询时: 我得到了我想要的(所有的结果,其中有参考黑莓,但不是Q10)。 但是,我想限制搜索的字段只限于“title”字段。例如,_source文档有标题、正文、标签等,我只想搜索标题。ElasticSearch“匹配”似乎很适合我... 虽然这只成功地搜索了标题,但它仍然返回标题中带有Q10的结果,这与上面的搜索不同。 我正在看比赛文档,但似乎不