【发布时间】:2019-07-24 06:37:36
【问题描述】:
我们有一个包含产品目录的弹性搜索索引,我们希望按标题和描述进行搜索。
我们希望它具有以下约束:
- 我们正在搜索出现的标题和描述(标题中的匹配应该是描述的两倍)
- 我们希望它有一个非常轻的模糊搜索结果(但仍然是准确的结果)
- 不应过滤掉与搜索词不匹配的结果,而应仅在稍后显示(因此匹配的结果应位于顶部,较差的结果应位于底部)
- category_id 应过滤掉产品(因此不应显示其他类别的结果)
- created_at 属性在排序中的价值也应该很高。 产品应该失去他们获得的“旧”分数。 (这很重要,因为它们每天都在失去重要性)
我曾尝试创建这样的查询,但结果确实不太准确。有时会发现完全不相关的东西。我认为这是因为通配符查询。
此外,我认为“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
}
}
}
]
}
}
}
【问题讨论】:
-
你试过用功能评分查询吗? elastic.co/guide/en/elasticsearch/reference/6.2/…
-
@KCFragrance 你的意思是距离问题?就像衰减 created_at 日期一样?不,我没有,但谢谢你的建议。剩下的“搜索词”问题呢?对于这样一个明显的用例,在标题和描述中搜索搜索词并使其对拼写错误稍微灵活一些,但仍然很好,必须有一种简单的方法或准备好的查询。对吗?
标签: elasticsearch