【问题标题】:ignore accents in elastic search with haystack使用 haystack 忽略弹性搜索中的重音符号
【发布时间】:2014-05-11 14:25:09
【问题描述】:

我使用 elasticsearch 和 haystack 来提供搜索。我希望用户使用英语以外的语言进行搜索。例如。目前正在尝试使用希腊语。

如何在搜索任何内容时忽略重音符号。例如。比方说,如果我输入 Ανδρέας(带重音符号),它的返回结果与之匹配。

但是当我输入 Ανδρεας 时,它没有返回任何结果。搜索引擎应该带来任何包含“Ανδρέας”但也包含“Ανδρεας”的结果(第二个没有重音)。

有人能指出如何解决这个问题吗?

如果我需要弹性搜索、search_indexex 等的帖子设置,请告诉我。

编辑:

这是我的索引设置:

ELASTICSEARCH_INDEX_SETTINGS = {
     'settings': {
         "analysis": {
             "analyzer": {
                 "myanalyzer_search": {
                     "type": "custom",
                     "tokenizer": "standard",
                     "filter": [
                         "greek_lowercase_filter",
                         "my_stop_filter",
                         "greek_stem_filter",
                         "english_stem_filter",
                         "my_edge_ngram_filter",
                         "asciifolding"
                     ]
                 },
                 "myanalyzer_index": {
                     "type": "custom",
                     "tokenizer": "edgeNGram",
                     "filter": [
                         "greek_lowercase_filter",
                         "my_stop_filter",
                         "greek_stem_filter",
                         "english_stem_filter",
                         "my_edge_ngram_filter",
                         "asciifolding"
                     ]
                 },
             },
             "tokenizer": {
                 "my_edge_ngram_tokenizer": {
                     "type": "edgeNGram",
                     "min_gram": "2",
                     "max_gram": "18",
                     "token_chars": ["letter"]
                 }
             },
             "filter": {
                 "my_edge_ngram_filter": {
                     "type": "edgeNGram",
                     "min_gram": 3,
                     "max_gram": 18
                 },
                 "greek_stem_filter": {
                     "type": "stemmer",
                     "name": "greek"
                 },
                 "greek_lowercase_filter": {
                     "type": "lowercase",
                     "language": "greek"
                 },
                 "english_stem_filter": {
                     "type": "stemmer",
                     "name": "english"
                 },
                 "my_stop_filter": {
                     "type": "stop",
                     "stopwords": ["_greek_", "_english_"]
                 }
             }
         }
     }
}

这存在于search_index.py

class ProfileIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.EdgeNgramField(document=True, use_template=True)
    title = indexes.CharField(model_attr='title')
    sorted_title = indexes.CharField(model_attr='title', indexed=False, stored=True)
    employment_history = indexes.EdgeNgramField(model_attr='employment_history', null=True)

    def get_model(self):
        return SellerProfile

    def index_queryset(self, using=None):
        return self.get_model().objects.all()


   .........

这是模板:

{{ object.user.get_full_name }}
{{ object.title }}
{{ object.bio }}
{{ object.employment_history }}
{{ object.education }}

我正在做如下查询:

results = SearchQuerySet().model(Profile).autocomplete(text='Ανδρεας')

results = SearchQuerySet().model(Profile).autocomplete(text='Ανδρέας')

谢谢。

【问题讨论】:

标签: elasticsearch search-engine django-haystack non-ascii-characters


【解决方案1】:

您需要将asciifolding 令牌过滤器添加到您的分析/查询管道http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-asciifolding-tokenfilter.html

这基本上会从您的单词中去除任何重音,以便您以后可以轻松地找到它们,无论是否使用重音搜索。

【讨论】:

  • 我已经添加了我的索引设置。你能告诉我我错过了什么吗?
  • 请同时添加您正在使用的映射和查询。
  • 添加了更多细节。您是指在索引设置中映射吗?
  • 我只是想确保您实际使用该字段的分析器 + 似乎您使用一些映射器来构建查询,您可以发布原始查询吗?
  • 同样的问题,你找到解决办法了吗?
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 2011-12-09
  • 2023-03-24
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多