弹性搜索:术语不存在时的积极提升

时间:2016-08-25 18:29:07

标签: elasticsearch

我正在尝试使用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”在查询结果中应该有更高的分数。

1 个答案:

答案 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条款。 所以我建议你做类似的事情。