gpt4 book ai didi

Elasticsearch 查询好的标题关键字结果

转载 作者:行者123 更新时间:2023-11-29 02:50:33 26 4
gpt4 key购买 nike

我们有一个包含产品目录的 elasticsearch 索引,我们希望按标题和描述进行搜索。

我们希望它有以下约束:

  • 我们正在搜索出现的标题和描述(标题中的匹配项应该是描述的两倍重要)
  • 我们希望它有一个非常模糊的搜索结果(但仍然是准确的结果)
  • 不应该过滤掉与搜索词不匹配的结果,而只是稍后显示(所以匹配的结果应该在顶部,较差的结果应该在底部)
  • category_id 应过滤掉产品(因此不应显示其他类别的结果)
  • created_at 属性在排序中也应该具有很高的值(value)。产品应该失去他们获得的“旧”分数。 (这很重要,因为他们每天都在失去重要性)

我曾尝试创建这样的查询,但结果确实不太准确。有时会发现完全不相关的东西。我认为这是因为通配符查询。

此外,我认为“created_at”评分必须有更优雅的解决方案。对吧?

我正在使用 Elasticsearch 6.2

这是我当前的代码。我很高兴看到一个优雅的解决方案:

{
"sort": [
{
"_score": {
"order": "desc"
}
}
],
"min_score": 0.3,
"size": 12,
"from": 0,
"query": {
"bool": {
"filter": {
"terms": {
"category_id": [
"212",
"213"
]
}
},
"should": [
{
"match": {
"title_completion": {
"query": "Development",
"boost": 20
}
}
},
{
"wildcard": {
"title": {
"value": "*Development*",
"boost": 1
}
}
},
{
"wildcard": {
"title_completion": {
"value": "*Development*",
"boost": 10
}
}
},
{
"match": {
"title": {
"query": "Development",
"operator": "and",
"fuzziness": 1
}
}
},
{
"range": {
"created_at": {
"gte": 1563264817998,
"boost": 11
}
}
},
{
"range": {
"created_at": {
"gte": 1563264040398,
"boost": 4
}
}
},
{
"range": {
"created_at": {
"gte": 1563256264398,
"boost": 1
}
}
}
]
}
}
}

最佳答案

首先,构建返回相关结果的请求通常是一项艰巨的任务。在不知道文件内容的情况下是做不到的。也就是说,我可以给你提示来满足你的要求并避免不相关的结果。

我们正在搜索标题和描述(标题中的匹配应该是描述的两倍重要)

您可以像在查询中那样使用 boost 来使标题匹配比描述匹配更重要。

我们希望它有一个非常模糊的搜索结果(但仍然是准确的结果)

你应该使用 AUTO模糊字段的值,以根据术语的长度定义不同的模糊值。例如,默认情况下少于 3 个字母的术语(最常见的术语,字母的变化会导致不同的词)将不允许更改。超过 3 个字母的条款允许更改 1 次,超过 5 个字母的条款允许更改 2 次。您可以根据您的测试更改此行为。

与搜索项不匹配的结果不应该被过滤掉,而只是稍后显示(所以匹配的结果应该在顶部,较差的结果应该在底部)

bool 语句中使用should 子句。 should 语句中的子句不过滤文档(除非另有说明)。 should 子句中的查询仅用于提高分数。

category_id 应过滤掉产品(因此不应显示其他类别的结果)

bool 语句中使用 must of filter 子句来确保所有文档都验证约束。如果您不希望子查询对分数有贡献(我相信这是您的情况),请使用 filter 而不是 match 因为 filter 会能够缓存结果。您的查询可以满足此要求。

created_at 属性在排序中也应该有很高的值(value)。产品应该失去他们获得的“旧”分数。 (这很重要,因为他们每天都在失去重要性)

你应该使用 function scoredecay function .如果衰减函数对您来说不是很清楚,您可以跳过文档中的方程式并跳至不言自明的图形。以下查询是使用高斯衰减函数的示例。

{
"function_score": {
// Name of the decay function
"gauss": {
// Field to use
"created_at": {
"origin": "now", // "now" is the default so you can omit this field
"offset": "1d", // Values with less than 1 day will not be impacted
"scale": "10d", // Duration for which the scores will be scaled using a gauss function
"decay" : 0.01 // Score for values further than scale
}
}
}
}

编写查询的提示

  • 避免通配符查询:如果您使用*,它们效率不高并且会消耗大量内存。如果您希望能够搜索部分术语(当用户搜索“house”时找到“penthouse”),您应该使用 ngram tokenizer 创建一个子字段并使用子字段编写标准的匹配查询。

  • 避免设置最低分数:分数是一个相对值。分数低或高并不意味着文档相关或不相关。你可以阅读this article关于这个主题。

  • 小心模糊查询:模糊会产生大量噪音并使用户感到困惑。一般来说,我会建议增加默认的 AUTO 模糊阈值,并接受一些拼写错误的查询不会返回好的结果。通常,与理解为什么他有完全不相关的结果相比,用户更容易检测到他输入中的拼写错误。

示例查询

这只是一个示例,您需要根据自己的数据进行调整。

{
"size": 12,
"query": {
"bool": {
"filter": {
"terms": {
"category_id": <CATEGORY_IDS>
}
},
"should": [
{
"match": {
"title": {
"query": <QUERY>,
"fuzziness": AUTO:4:12,
"boost": 3
}
}
},
{
"match": {
"title_completion": {
"query": <QUERY>,
"boost": 1
}
}
},
{
"match": {
// title_completion field with ngram tokenizer
"title_completion.ngram": {
"query": <QUERY>,
// Use lower boost because it match only partially
"boost": 0.5
}
}
}
]
},
"function_score": {
// Name of the decay function
"gauss": {
// Field to use
"created_at": {
"origin": "now", // "now" is the default so you can omit this field
"offset": "1d", // Values with less than 1 day will not be impacted
"scale": "10d", // Duration for which the scores will be scaled using a gauss function
"decay" : 0.01 // Score for values further than scale
}
}
}
}
}

关于Elasticsearch 查询好的标题关键字结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57053073/

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