我正在使用Haystack和Django一起,并且我有用户搜索地址的搜索功能。 99%的时间里,地址中唯一发生变化的地方就是国家名称。例如,它可以说“德国”或“Deutchland”。Add ElasticSearch与Django Haystack同义词
我想将所有国家的同义词添加到我所得到的。因此,例如,德国将是:
德国,Deutchland,德国
如何做到这一点用草堆?
我使用的引擎是ElasticSearch。
我正在使用Haystack和Django一起,并且我有用户搜索地址的搜索功能。 99%的时间里,地址中唯一发生变化的地方就是国家名称。例如,它可以说“德国”或“Deutchland”。Add ElasticSearch与Django Haystack同义词
我想将所有国家的同义词添加到我所得到的。因此,例如,德国将是:
德国,Deutchland,德国
如何做到这一点用草堆?
我使用的引擎是ElasticSearch。
您需要首先了解的是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,然后应用lowercase
和my_synonym_filters
顺序。
唯一的问题是,没有办法将这些设置应用于Haystack管理索引,至少不是开箱即用的。 Haystack的ElasticSearch后端应用了自己的设置,不能直接覆盖它们。但是,您可以非常轻松地创建或使用Haystack搜索后端,该后端可扩展基本ElasticSearch后端,然后使用您自己的搜索设置。如果你正在寻找一个如何做到这一点的例子,我建议从elasticstack开始。这是一个小型工具集,旨在解决这个问题,主要是提供可配置的ElasticSearch设置,因此您可以将分析设置放在settings.py
文件中。
我应该很容易在您的搜索索引文件中使用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 }}
重新索引你的数据,你应该通过它的同义词:)
如果我将所有不同的语言添加到文档中,这不会“欺骗”数据,并且使ElasticSearch更难匹配查询并查看相关内容? 例如,如果我会用10种不同的语言进行长时间描述,那么500个单词就是5000个单词。如果文档中90%的内容与用户查询的语言完全不同,那么用户查询是否会“低分”匹配? – 2015-03-26 02:36:52
确定它会“欺骗”数据和搜索结果。在这种情况下,我会为每种语言指定一个单独的索引,这里是[用于多语言搜索的干草堆示例](http://anthony-tresontani.github.io/Django/2012/09/20/multilingual-search /)。 – 2015-03-26 11:05:51
你能显示你的搜索索引文件吗? – 2015-03-25 17:34:21