2015-03-25 44 views
2

我正在使用Haystack和Django一起,并且我有用户搜索地址的搜索功能。 99%的时间里,地址中唯一发生变化的地方就是国家名称。例如,它可以说“德国”或“Deutchland”。Add ElasticSearch与Django Haystack同义词

我想将所有国家的同义词添加到我所得到的。因此,例如,德国将是:

德国,Deutchland,德国

如何做到这一点用草堆?

我使用的引擎是ElasticSearch。

+0

你能显示你的搜索索引文件吗? – 2015-03-25 17:34:21

回答

2
发现国

您需要首先了解的是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

我应该很容易在您的搜索索引文件中使用tempalte标签来完成。

假设模型找你的索引是ADRESS您address_text.txt应该是这样的:

address_text.tx

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

您应该创建一个模板标签中添加同义词到您的索引文件

my_app/templatetags/search_utils.py(伪代码...不测试ED)

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 

Finaly使用新的标签在你address_text.txt(索引文件)

# loading the tag  
{% load search_utils %}  

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

重新索引你的数据,你应该通过它的同义词:)

+0

如果我将所有不同的语言添加到文档中,这不会“欺骗”数据,并且使ElasticSearch更难匹配查询并查看相关内容? 例如,如果我会用10种不同的语言进行长时间描述,那么500个单词就是5000个单词。如果文档中90%的内容与用户查询的语言完全不同,那么用户查询是否会“低分”匹配? – 2015-03-26 02:36:52

+0

确定它会“欺骗”数据和搜索结果。在这种情况下,我会为每种语言指定一个单独的索引,这里是[用于多语言搜索的干草堆示例](http://anthony-tresontani.github.io/Django/2012/09/20/multilingual-search /)。 – 2015-03-26 11:05:51