弹性搜索:提升“更好”的条款

时间:2016-01-23 18:57:27

标签: elasticsearch

对以下内容进行成像,搜索术语“褐狐狸”。

所有文档都有另一个字段,称为备用名称。

这个领域有时会包含像“动物”或“狐狸”这样的好词。有时它包含“不好”(或人类可读)的术语,如ED2314或1231-234-D。

“不好”的东西有什么共同之处,他们有一个“高”数字或者他们真的不是人类语言WIPSDIFOW。

关于“提升”的任何想法或将更好的术语排在最前面?

更新2016-01-24 感谢你的提问。

例如,搜索将在字段“name”上完成。使用用户输入不会查询“备用名称”字段。它只是一个与排序相关的字段。用户喜欢在结果列表中看到它,但是使用解释的排序/提升。 THX

2 个答案:

答案 0 :(得分:1)

你可以做一些有限的基于脚本的scoringsorting(性能损失)。

但如果这是(可能)许多基于非结构化数据“调整评分”的请求中的第一个,那么您可以更好地注释您的数据(预索引)以在索引中更清楚地编码评分逻辑。

即。添加alternate_name.dictionary_wordsalternate_name.non_dictionary_words(可能还有alternate_name.dictionary_word_composition_percent)等字段,并在加载数据集之前使用字典来丰富数据集。

这里的优点是评分策略出现在数据中,查询性能(包括评分或排序标准中的“百分比”字段)更好,并且您将能够使用人类可读的术语隔离以用于将来的功能(facets / autocomplete / spellcheck)。此外,非人类可读的术语将更易于进行以供将来分析(例如,当您有足够的信息来注释/分离时说“part_numbers”)

答案 1 :(得分:0)

使用bool查询,您可以将好的术语(查询子句)封装到should键中:

{
    "query": {
        "bool": {
            "must": {
                "match": {  
                    "field": {
                        "query": "User input"
                    }
                }
            },
            "should": [
                { "match": {
                    "field": {
                        "query": "Animal"
                    }
                }},
                { "match": {
                    "field": {
                        "query": "Fox"
                    }
                }}
            ]
        }
    }
}

要控制好条款的相关性,您也可以使用boost选项:

...
{
  "match": {
    "field": {
      "query": "Fox",
      "boost": 3
    }
  }
}
...

请参阅Reference