gpt4 book ai didi

database - Elasticsearch 通过 "Partial Term"而不是 "Entire Term"进行聚合

转载 作者:搜寻专家 更新时间:2023-10-30 23:05:24 29 4
gpt4 key购买 nike

我目前正尝试在 elasticsearch 中做一些有趣的事情……而且它几乎可以工作。

用例:我必须将每个特定字段的结果数限制为 (x) 个结果。

示例:在餐厅的结果集中,我只想为每个餐厅名称返回两个位置。如果我搜索 Mexican Food,那么我应该得到 (x) Taco Bell hits、(x) Del Taco Hits 和 (x) El Torito Hits。

问题:我的聚合目前只匹配词条的部分内容。

例如:如果我尝试匹配 company_name,它将为 taco 创建一个桶,为 bell< 创建另一个桶/em>,所以 Taco Bell 可能会出现在 2 个桶中,从而导致该公司的 (x) * 2 结果。

我很难相信这是理想的行为。有没有一种方法可以按整个搜索词进行汇总?

这是我当前的聚合 JSON:

"aggs": {
"by_company": {
"terms": {
"field": "company_name"
},
"aggs": {
"first_hit": {
"top_hits": {"size":1, "from": 0}
}
}
}
}

一如既往,非常感谢您的帮助!

最佳答案

是的。如果您的“company_name”只是标准分析器的常规字符串,或者您用于“company_name”的任何分析器正在拆分名称,那么这就是您的答案。 ES 存储“术语”,而不是单词或整个文本,除非您告诉它。

假设您当前对该字段的分析器执行我上面描述的操作,那么您需要另一个 - 我们称之为“原始” - 应该反射(reflect)您的 company_name 字段但它应该存储公司名称的字段原样。

这就是我的意思:

{
"mappings": {
"test": {
"properties": {
...,
"company_name": {
"type": "multi_field",
"fields": {
"company_name": {
"type": "string" #and whatever you currently have in your mapping for `company_name`
},
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}

在您的查询中,您将这样做:

"aggs": {
"by_company": {
"terms": {
"field": "company_name.raw"
},
"aggs": {
"first_hit": {
"top_hits": {"size":1, "from": 0}
}
}
}
}

关于database - Elasticsearch 通过 "Partial Term"而不是 "Entire Term"进行聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27278236/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com