Skip to main content
 首页 » 编程设计

python之使用 Django Haystack 添加 ElasticSearch 同义词

2024年10月25日37sky-heaven

我将 Haystack 与 Django 一起使用,我有一个搜索功能,用户可以在其中搜索地址。 99% 的时间,地址中唯一被本地化或更改的是国家/地区名称。例如,它可以说“德国”或“德国”。

我想为我得到的所有国家添加同义词。因此,例如德国将是:

德国、德国、德国

我如何使用 Haystack 做到这一点?

我使用的引擎是 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 后端应用自己的设置,不能直接覆盖它们。但是,您可以非常轻松地创建或使用扩展基本 ElasticSearch 后端的 Haystack 搜索后端,然后使用您自己的搜索设置。如果您正在寻找如何执行此操作的示例,我建议您从 elasticstack 开始。 .这是一个旨在解决此问题的小型工具集,主要提供可配置的 ElasticSearch 设置,因此您可以将分析设置直接放在 settings.py 文件中。