2015-03-25 46 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