将字符串列表定义为多字符串的同义词

时间:2017-05-05 09:01:22

标签: elasticsearch

我想提供字段“title”的变体作为其同义词。我希望如果用户搜索确切的标题或其任何变体,则应首先返回此特定文档。

例如。我有很多常见问题文件。其中之一是

faq document

下面是所需的faq及其同义问题

my csv dump with question variations

我读到了多词同义词出现的复杂性。任何人都可以建议我如何将所有这些问题变体映射为与实际问题等效并引用相同的文档?

我想到的解决方案之一是,将所有问题变体添加为我的索引中的另一个属性字段,同时查询(使用查询more_like_this)提供标题(这里它指的是问题常见问题的实际标题)和问题变体列表。

以下是我的索引,摄取数据和查询代码:

PUT faq { "mappings": { "articles": { "properties": { "title": { "type": "string" }, "ques_var": { "type": "string" }, "detail": { "type": "string" }, "detail_html": { "type": "string" }, "account_id": { "type": "long" } } } } }

这里我的“标题”是“如何登录Facebook?”

我的“ques_var”会是[“facebook登录?”,“登录facebook的地方”,“我是否需要注册登录facebook”]

我的查询如下:

eq.query(Query.more_like_this([constants.TITLE, constants.QUES_VAR], input_data[constants.QUERY],min_term_freq=options.faq_min_term_freq,min_doc_freq=options.faq_min_doc_freq))
如果这种方法是正确的,请告诉我。此外,这种方法不会为问题变体和标题提供相同的IDF(相关性分数)

1 个答案:

答案 0 :(得分:0)

ElasticSearch版本5.4为此提供了新的内置自动建议功能。

请参阅You complete me :)。这是使用elasticsearch创建自动建议插件的最佳文章。

PS:它确实支持同义词。

演示: 以同一篇文章为例:

如果'庭院'和'marriot'是两个相互同义的词。您可以在建议器设置中指定相同的内容,如:

 "analysis": {
  "analyzer": {
    "suggest_synonyms": {
      "type":      "custom",
      "tokenizer": "lowercase",
      "filter":    [ "my_synonyms" ]
    }
  },
  "filter": {
    "my_synonyms": {
      "type":     "synonym",
      "synonyms": [ "courtyard, marriot" ]
    }
  }
}
},

以下列方式创建映射并启用同义词建议:

"mappings": {
"hotel" : {
  "properties" : {
    "name" : { "type" : "string" },
    "city" : { "type" : "string" },
    "name_suggest" : {
      "type" :            "completion",
      "index_analyzer" :  "suggest_synonyms",
      "search_analyzer" : "suggest_synonyms"
    }
  } 
}}

此处,自动建议在字段'name_suggest'上完成

现在,索引很少这样的文档:

curl -X PUT 'localhost:9200/hotels/hotel/3?refresh=true' -d '
{
  "name" :         "Courtyard Hotel",
  "city" :         "Munich",
  "name_suggest" : "Courtyard Hotel"
}'
curl -X PUT 'localhost:9200/hotels/hotel/3?refresh=true' -d '
{
  "name" :         "Marriot Hotel",
  "city" :         "Munich",
  "name_suggest" : "Marriot Hotel"
}'

现在,如果您在汽车建议中搜索“庭院”,它还将返回万豪酒店,因为我们已经指定了'庭院'和'Marriot'作为同义词:)