我正在使用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