添加ElasticSearch同义词与Django Haystack

时间:2015-03-25 11:40:25

标签: python django elasticsearch django-haystack

我正在和Django一起使用Haystack,我有一个用户搜索地址的搜索功能。 99%的时间在地址中唯一被本地化或更改的是国家/地区名称。例如,它可以说“德国”或“Deutchland”。

我想在我获得的所有国家/地区添加同义词。例如德国就是:

德国,Deutchland,Tyskland

如何使用Haystack做到这一点?

我正在使用的引擎是ElasticSearch。

2 个答案:

答案 0 :(得分:3)

首先要了解的是ElasticSearch的工作原理,以及如何根据自己的意愿弯曲Haystack。我这样做的方法是提供你自己的设置字典来覆盖Haystack使用的字典,指定你想要使用的ElasticSearch配置。

首先你需要设置synonyms filter,这可以使用同义词配置文件或列表来完成(我从其他人那里听到列表worked better for them)。当ElasticSearch对内容进行索引时,它首先将其标记(将其分解为单词或单词组件),然后过滤这些组件。过滤是很多魔术的地方。发生,就像删除常用单词,小写,生成同义词。为了创建同义词,您需要告诉ElasticSearch您要使用同义词过滤器,然后您需要为其提供同义词映射。

{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonym_filter": {
          "type": "synonym", 
          "synonyms": [ 
            "germany,deutchland,tyskland",
          ]
        }
      },
      "analyzer": {
        "my_synonyms": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "my_synonym_filter" 
          ]
        }
      }
    }
  }
}

此配置告诉ElasticSearch使用standard tokenizer,然后按顺序应用lowercasemy_synonym_filters

唯一的问题是,无法将这些设置应用于您的Haystack托管索引,至少不是开箱即用的。 Haystack的ElasticSearch后端应用自己的设置,不能直接覆盖它们。但是,您可以非常轻松地创建或使用Haystack搜索后端,扩展基础ElasticSearch后端,然后使用您自己的搜索设置。如果您正在寻找如何执行此操作的示例,我建议您从elasticstack开始。它是一个旨在解决此问题的小工具集,主要提供可配置的ElasticSearch设置,因此您可以将分析设置放在settings.py文件中。

答案 1 :(得分:-1)

我应该使用tempalte标签在搜索索引文件中轻松完成。

假设您的索引模型是地址,您的address_text.txt应如下所示:

<强> address_text.tx

{{ object.anyfield }}
{{ object.city }}
{{ objects.country }}

您应创建模板标记以将同义词添加到索引文件

my_app / templatetags / search_utils.py (伪代码......未经过测试)

from django import template
register = template.library

# country names lowercase for easier match
COUNTRY_NAME_SYNONYMS = [
    ['germany', 'deutchland', 'tyskland'],
    ['france', 'frankreich']
]

@register.filter
def add_country_synonyms(country_name):
    synonyms = " ".join([syn_list for syn_list in COUNTRY_NAME_SYNONYMS if country_name.lower() in syn_list])
    return synonyms

最后在 address_text.txt (索引文件)中使用新标记

# loading the tag    
{% load search_utils %}    

{{ object.anyfield }}
{{ object.city }}
{{ object.country }}
# getting the synonyms
{{ object.country|add_country_synonyms }}

重新索引您的数据,您应该通过其同义词找到国家:)