Elasticsearch:推动缺少某些术语

时间:2016-10-26 17:00:28

标签: search elasticsearch

我如何积极推动缺少某些条款?我在here之前问过这个问题,但反应并不令人满意,因为它不够普遍。

让我们再试一次,有更多的细微差别。

我希望能够区分笔记本电脑和配件。在人类语言中,这是通过缺乏术语来完成的。也就是说,当你说battery时,你知道通过省略单词lenovo thinkpad battery,你的意思是你想要实际的笔记本电脑。比较一个人说PUT test_index { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1 } } } 时,他们指的是电池。

假设我们有索引:

PUT test_index/_mapping/merchant
{
    "properties": {
        "title": {
            "type": "string"
        },
        "category": {
            "type": "string",
            "index": "not_analyzed"
        }
    }
}

带映射:

PUT test_index/merchant/3
{
    "title": "macbook battery", 
    "category": "laptops accessories"
}
PUT test_index/merchant/2
{
    "title": "lenovo thinkpad battery", 
    "category": "laptops accessories"
}
PUT test_index/merchant/1
{
    "title": "lenovo thinkpad white/black", 
    "category": "laptops"
}

将两个项目放入其中:

lenovo thinkpad

现在搜索POST test_index/_search { "query":{ "match": { "title": "lenovo thinkpad" } } }

"hits": [
   {
      "_index": "test_index",
      "_type": "merchant",
      "_id": "2",
      "_score": 0.70710677,
      "_source": {
         "title": "lenovo thinkpad battery",
         "category": "laptops accessories"
      }
   },
   {
      "_index": "test_index",
      "_type": "merchant",
      "_id": "1",
      "_score": 0.70710677,
      "_source": {
         "title": "lenovo thinkpad white/black",
         "category": "laptops"
      }
   }
]

结果是:

lenovo thinkpad battery

通知lenovo thinkpad white/black高于title

现在,我至少可以看到两种合理的方法。

A)在每个类别的基础上使用术语频率来影响battery匹配的相关性。例如,如果对于每个类别,您提取95%的百分位词,那么laptops accessories中的battery是一个高频词,因此title这个词应该在所有词上被加强category个问题。

B)在每个类别的基础上使用术语频率来影响title匹配的相关性。例如,除了标题匹配之外,您还会自动对结果进行负面推送,这些结果的类别包含95%百分位字词,而这些字词未包含在- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string匹配中。

A和B并不完全相同,但它们都依赖于某些缺席词应该被考虑为相关性的想法。

所以......想法?

3 个答案:

答案 0 :(得分:0)

我的投票结果是 C) 修复类别,以便电池没有“笔记本电脑”。作为一个类别(它' laptopAccessory'或只是'附件')或者创建一个额外的类别(不称为“笔记本电脑'”)来指示实际的机器他们自己。

在您的搜索中,您不会尝试降低配件的排名,而是应用于笔记本电脑'类别(不再含糊不清)。这将导致初始搜索,如您的lenovo thinkpad'将实际机器放在配件上方。更准确的搜索(' lenovo thinkpad battery')仍然可以正常运行。

另一个不错的UI / UX体验是获取结果中返回的总类别集,并提供简单的过滤器链接。因此,如果您的初始搜索返回笔记本电脑' '配件' '付款计划'然后您将其中的每一个作为重新查询的链接,使用原始搜索加上该类别的过滤器。

祝你好运!

答案 1 :(得分:0)

提升“那个”类别。

GET /test_index/merchant/_search
{
  "from": 0,
  "query": {
    "bool": {
      "must": [
        {"match": {"title": "lenovo thinkpad"}}
      ],
      "should": [
        {
          "match": {
            "category": {
              "boost": "2",
              "query": "laptops"
            }
          }
        }
      ]
    }
  },
  "size": "10"
}

<强>结果:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1.573319,
    "hits": [
      {
        "_index": "index",
        "_type": "merchant",
        "_id": "1",
        "_score": 1.573319,
        "_source": {
          "title": "lenovo thinkpad white/black",
          "category": "laptops"
        }
      },
      {
        "_index": "index",
        "_type": "merchant",
        "_id": "2",
        "_score": 0.15889977,
        "_source": {
          "title": "lenovo thinkpad battery",
          "category": "laptops accessories"
        }
      }
    ]
  }
}

有关提升的更多信息,可以是found here

答案 2 :(得分:0)

我们可以使用在查询该术语时提供的boost属性来更新某些术语的缺失。 请检查以下查询,并将boost属性设置为10。

html: '<div id="content"><h1>Content will display here...</h1></div>'