3

我想使用 ElasticSearch 术语建议功能进行拼写更正(您的意思是...?)。这是官方文档

这是我的(简化为基础)方案:

{
    "settings": {
        "analysis": {
            "filter": {
                "en_stop_filter": { "type": "stop", "stopwords": ["_english_"] },
                "en_stem_filter": { "type": "stemmer", "name": "minimal_english" },
                "de_stop_filter": { "type": "stop", "stopwords": ["_german_"] },
                "de_stem_filter": { "type": "stemmer", "name": "minimal_german" }
            },
            "analyzer": {
                "en_analyzer": { "type": "custom", "tokenizer": "icu_tokenizer", "filter": ["icu_folding", "icu_normalizer", "en_stop_filter", "en_stem_filter"] },
                "de_analyzer": { "type": "custom", "tokenizer": "icu_tokenizer", "filter": ["icu_folding", "icu_normalizer", "de_stop_filter", "de_stem_filter"] }
            }
        }
    },
    "mappings": {
        "blog": {
            "_analyzer": { "path": "my_analyzer", "index": "no" },
            "properties": {
                "title": { "type": "string" },
                "my_analyzer": { "type": "string", "index": "no" }
            }
        },
        "photo": {
            "properties": {
                "tags_en": { "type": "string", "analyzer": "en_analyzer", "index_name": "tag_en" }
                "tags_de": { "type": "string", "analyzer": "de_analyzer", "index_name": "tag_de" }
            }
        }
    }
}

这就是通过 Python/Django 为 a) 我们的博客索引数据的方式:

data = ''
for i, p in enumerate(BlogPost.objects.all()):
    data += '{"index": {"_id": "%s"}}\n' % p.pk
    data += json.dumps({ "my_analyzer": p.language+"_analyzer", "title": p.title })+'\n'
resp = requests.put(ELASTICSEARCH_URL+'blog/_bulk', data=data)

我正在根据每篇博客文章的语言(p.language = 'de' 或 'en')设置分析器,无论是German还是English

我可以搜索这个索引(通过 Python),并且确实得到了使用这些参数返回的拼写建议:

{
  "query": {
    "query_string": {
      "query": q,
      "analyzer": "en_analyzer"
    }
  },
  "suggest": {
    "my_suggestion": {
      "text": q,
      "term": {
        "size": 1,
        "field": "title"
      }
    }
  }
}

但是,我真正需要的是对我们的照片方案进行搜索的拼写建议,该方案由以下索引(Python/Django):

for p in Photo.objects.all():
    data += '{"index": {"_id": "%s"}}\n' % p.pk
    data += json.dumps({
        "tags_cs": p.tags_en,
        "tags_de": p.tags_de
    })+'\n'
resp = requests.put(ELASTICSEARCH_URL+'photo/_bulk', data=data)

p.tags_en 和 p.tags_de 可以被索引为逗号分隔的标签字符串,或者作为实际的字符串列表。两者都适用于 ElasticSearch,它似乎对这个问题没有影响。

用英语和德语搜索照片都有效,但没有返回任何拼写建议:

{
  "query": {
    "query_string": {
      "query": q,
      "fields": [
        "tags_en"
      ],
      "analyzer": "en_analyzer"
    }
  },
  "suggest": {
    "my_suggestion": {
      "text": q,
      "term": {
        "size": 1,
        "field": "tags_en"
      }
    }
  }
}

如果我为建议术语定义分析器,这没有什么区别,如下所示:

{
  "query": {
    "query_string": {
      "query": q,
      "fields": [
        "tags_en"
      ],
      "analyzer": "en_analyzer"
    }
  },
  "suggest": {
    "my_suggestion": {
      "text": q,
      "term": {
        "size": 1,
        "field": "tags_en",
        "analyzer": "en_analyzer"
      }
    }
  }
}

请注意博客文章和照片之间分析的区别:我们的博客文章每篇文章都以一种语言进行分析。通过my_analyzer方案中的字段。但是,我们的照片是按字段进行分析的。我们确实有 20 种语言(这里只显示了两种以使代码尽可能小),并且相应地分析每个标签字段。如果我删除这种类型的照片分析,我也会在那里得到建议,但我们确实需要基于字段的分析器。

所以这个问题一定与分析仪有关,但我完全被困住了。有任何想法吗?

4

1 回答 1

0

一个可行的解决方案/解决方法是在方案中简单地包含一个未分析的字段,并仅在该字段上匹配术语建议。它对我们有用,但是如果没有这些额外的数据,它应该是可能的。

于 2013-10-10T05:47:05.797 回答