3

エラスティックサーチの用語提案機能をスペル修正に使用したいのですが (もしかして...? )。公式ドキュメントは次のとおりです。

これが私の(基本に短縮された)スキームです:

{
    "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"
      }
    }
  }
}

ブログ投稿と写真の分析の違いに注意してください。ブログ投稿は、投稿ごとに 1 つの言語で分析されます。my_analyzerスキームのフィールドを介して。ただし、私たちの写真はフィールドごとに分析されます。20 の言語があり (コードをできるだけ小さくするために、ここでは 2 つだけを示しています)、各タグ フィールドはそれに応じて分析されます。写真のこの種の分析を削除すると、そこにも提案が表示されますが、実際にはフィールドベースのアナライザーが必要です.

したがって、問題はアナライザーに関係しているに違いありませんが、私は完全に立ち往生しています。何か案は?

4

1 に答える 1