【问题标题】:Elasticsearch: positive boost when term is not presentElasticsearch:不存在术语时的积极提升
【发布时间】:2016-08-25 18:29:07
【问题描述】:

我正在尝试使用 Elasticsearch 实现对产品的简单搜索。

我遇到的一个问题是搜索查询通常包含隐含的术语。例如,考虑当有人输入“联想 thinkpad 电池”时,他们想要一块电池。但是,当有人只输入“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”不包含我手动选择的那些特殊术语之一,例如“battery”,我希望不包含该术语的文档被积极提升,以便文档与"item_title": "lenovo thinkpad white/black" 在查询结果中应该有更高的分数。

【问题讨论】:

  • 请考虑添加查询和映射以供参考,以更有效地了解您的问题
  • @user3775217 完成

标签: elasticsearch


【解决方案1】:

如果我在我的维基百科索引中执行以下查询

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 子句中,但我将 Darmstadt School 作为第一个结果。 所以我建议你做类似的事情。

【讨论】:

  • 如果我想在NOT阵营中添加更多的单词,语法是什么?
  • "query": "(Darmstadt AND SCHOOL)^10 (NOT School)^8 (NOT Something1)^8 (NOT Something2)^8"
  • 仍然是理解“use_dis_max”的关键:true 这是恕我直言,查询中最重要的部分让 a、b、c 为布尔值,a+b+c 是我的布尔查询,如果(a+b+c) 比我的查询在 use_dis_max 中成功 acb>a+b+c>a+b=a+c=a+b>a=b=c在这种情况下,弹性搜索的工作方式是尽可能匹配尽可能多的文档
猜你喜欢
  • 1970-01-01
  • 2018-04-26
  • 2016-04-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 2021-02-28
  • 1970-01-01
相关资源
最近更新 更多