使用 Django Haystack 添加 ElasticSearch 同义词
Add ElasticSearch Synonyms with Django Haystack
我将 Haystack 与 Django 一起使用,我有一个搜索功能,用户可以在其中搜索地址。 99% 的时间,地址中唯一被本地化或更改的是国家/地区名称。例如,它可以说 "Germany" 或 "Deutchland".
我想为我得到的所有国家添加同义词。因此,例如德国将是:
德国、德国、德国
如何使用 Haystack 执行此操作?
我使用的引擎是 ElasticSearch。
使用 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 }}
重新索引您的数据,您应该可以通过同义词找到国家/地区:)
您首先需要了解的是它在 ElasticSearch 中的工作原理,然后是如何让 Haystack 屈服于您的意愿。我这样做的方法是提供您自己的设置字典来覆盖 Haystack 使用的字典,指定您要使用的 ElasticSearch 配置。
首先你需要设置一个synonyms filter, which can be done using a synonym configuration file or a list (I heard back from someone else that the list worked better for them)。当 ElasticSearch 索引内容时,它首先对其进行标记化(将其分解为单词或单词组件),然后过滤这些组件。过滤是很多 'magic' 发生的地方,比如删除常用词、小写、生成同义词。为了创建同义词,您需要告诉 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 后端应用自己的设置,不能直接覆盖它们。但是,您可以非常轻松地创建或使用扩展基本 ElasticSearch 后端的 Haystack 搜索后端,然后使用您自己的搜索设置。如果您正在寻找如何执行此操作的示例,我建议您从 elasticstack 开始。这是一个旨在解决此问题的小型工具集,主要提供可配置的 ElasticSearch 设置,因此您可以将分析设置直接放在 settings.py
文件中。
我将 Haystack 与 Django 一起使用,我有一个搜索功能,用户可以在其中搜索地址。 99% 的时间,地址中唯一被本地化或更改的是国家/地区名称。例如,它可以说 "Germany" 或 "Deutchland".
我想为我得到的所有国家添加同义词。因此,例如德国将是:
德国、德国、德国
如何使用 Haystack 执行此操作?
我使用的引擎是 ElasticSearch。
使用 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 }}
重新索引您的数据,您应该可以通过同义词找到国家/地区:)
您首先需要了解的是它在 ElasticSearch 中的工作原理,然后是如何让 Haystack 屈服于您的意愿。我这样做的方法是提供您自己的设置字典来覆盖 Haystack 使用的字典,指定您要使用的 ElasticSearch 配置。
首先你需要设置一个synonyms filter, which can be done using a synonym configuration file or a list (I heard back from someone else that the list worked better for them)。当 ElasticSearch 索引内容时,它首先对其进行标记化(将其分解为单词或单词组件),然后过滤这些组件。过滤是很多 'magic' 发生的地方,比如删除常用词、小写、生成同义词。为了创建同义词,您需要告诉 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 后端应用自己的设置,不能直接覆盖它们。但是,您可以非常轻松地创建或使用扩展基本 ElasticSearch 后端的 Haystack 搜索后端,然后使用您自己的搜索设置。如果您正在寻找如何执行此操作的示例,我建议您从 elasticstack 开始。这是一个旨在解决此问题的小型工具集,主要提供可配置的 ElasticSearch 设置,因此您可以将分析设置直接放在 settings.py
文件中。