我正在尝试使用Elasticsearch实现对产品的简单搜索。
我遇到的一个问题是,搜索查询通常都有隐含条款。例如,考虑到当有人输入“lenovo thinkpad battery”时,他们想要一块电池。但是,当有人输入“lenovo thinkpad”时,他们想要一台笔记本电脑,即使这个术语没有出现在查询中。
我的解决方案如下。手动拼凑一堆相关术语。例如,对于计算机/笔记本电脑类别,我可以使用“电池”,“键盘”,“电源线”,“适配器”,“电缆”,“保护计划”等术语。然后,每当没有这样的术语时搜索查询,我积极推动所有不包含这些条款的结果。
Elasticsearch可以实现吗?
编辑:
示例文件
{"_source": { "item_title": "lenovo thinkpad white/black" },
"_source": { "item_title": "lenovo thinkpad battery" }
}
映射
{
"properties": {
"item_title": {
"type": "string"
}
}
}
查询
POST my_index/my_type/_search
{
"from": 0,
"size": 10,
"query": {
"match": {
"item_title": "lenovo thinkpad"
}
}
}
查询结果:
"hits": {
"total": 2,
"max_score": 0.2169777,
"hits": [
{
"_index": "my_index",
"_type": "my_type",
"_id": "2",
"_score": 0.2169777,
"_source": {
"item_title": "lenovo thinkpad battery"
}
},
{
"_index": "my_index",
"_type": "my_type",
"_id": "1",
"_score": 0.2169777,
"_source": {
"item_title": "lenovo thinkpad black/white"
}
}
]
}
请注意,这两个结果的得分是相同的。但是,由于查询“lenovo thinkpad”不包含我手动挑选的那些特殊术语之一,比如“电池”,我希望不包含该术语的文档得到积极提升,以便文档与“item_title”:“lenovo thinkpad white / black”在查询结果中应该有更高的分数。
答案 0 :(得分:0)
如果我在维基百科索引中执行以下查询
GET /_search
{
"query": {
"query_string": {
"query": "(Darmstadt)^10 (NOT School)^8",
"fields": [
"title^3"
],
"phrase_slop": 3,
"use_dis_max": true
}
}
}
我仍然将达姆施塔特学校的成绩进一步列入名单(通常是前10名)
如果我执行以下查询
GET /_search
{
"query": {
"query_string": {
"query": "(Darmstadt AND SCHOOL )^10 (NOT School)^8",
"fields": [
"title^3"
],
"phrase_slop": 3,
"use_dis_max": true
}
}
}
我把达姆施塔特学校作为第一个结果,尽管它属于NOT条款。 所以我建议你做类似的事情。