我正在和Django一起使用Haystack,我有一个用户搜索地址的搜索功能。 99%的时间在地址中唯一被本地化或更改的是国家/地区名称。例如,它可以说“德国”或“Deutchland”。
我想在我获得的所有国家/地区添加同义词。例如德国就是:
德国,Deutchland,Tyskland
如何使用Haystack做到这一点?
我正在使用的引擎是ElasticSearch。
答案 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,然后按顺序应用lowercase
和my_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 }}
重新索引您的数据,您应该通过其同义词找到国家:)