我想使用ElasticSearch术语建议功能进行拼写更正(您的意思是......?)。这是官方documentation:
这是我的(缩短为基础)计划:
{
"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为我们的博客索引数据的方式:
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')的语言设置分析器,德语或英语。
我能够搜索这个索引(通过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种语言(这里只显示了两种语言以保持代码尽可能小),并相应地分析每个标记字段。
如果我删除这种类型的照片分析,我也会在那里得到建议,但我们确实需要基于现场的分析仪。
所以问题必须与分析仪有关,但我完全陷入困境。有什么想法吗?
答案 0 :(得分:0)
工作解决方案/解决方法是在计划中简单地包含未分析的字段,并仅在此字段上匹配术语建议。它适用于我们,但是如果没有这些额外的数据,它应该是可能的。