1

Elasticsearch 1.2.1 を使用しています。

Ngram トークナイザーを使用してドキュメントをトークン化しています。フィールドが非常に長い (200 ~ 500 文字) 可能性がある特別なユース ケースがあり、フィールドの任意のポイントからの長い (最大 200 文字) "含む" クエリをサポートしたいと考えています。

最大 260 文字の Ngram アナライザーから始めましたが、インデックス時間が遅すぎて容量が大きすぎることがすぐにわかったので、サイズを約 30 文字に減らしました。

ここで、30 文字を超えるトークンを小さなトークンに分割し、ユーザー検索を壊れたトークンに置き換えたいと考えています (より大きな Ngram インデックスを使用した場合よりも多くの結果が得られる可能性があることを知っています)。 .

この機能を実現するための推奨される方法は何ですか? クエリ文字列クエリを使用していることに注意してください。

4

1 に答える 1

2

ここで説明されているソリューションを試してください: ElasticSearch での正確な部分文字列検索

{
    "mappings": {
        "my_type": {
            "index_analyzer":"index_ngram",
            "search_analyzer":"search_ngram"
        }
    },
    "settings": {
        "analysis": {
            "filter": {
                "ngram_filter": {
                    "type": "ngram",
                    "min_gram": 3,
                    "max_gram": 8
                }
            },
            "analyzer": {
                "index_ngram": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": [ "ngram_filter", "lowercase" ]
                },
                "search_ngram": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": "lowercase"
                }
            }
        }
    }
}

ディスク使用量の問題と長すぎる検索用語の問題を解決するために、短い 8 文字のngramが使用されます (構成: "max_gram": 8 )。8 文字を超える用語を検索するには、検索をブール AND クエリに変換して、その文字列内の個別の 8 文字の部分文字列をすべて検索します。たとえば、ユーザーが大きなヤード(10 文字の文字列) を検索した場合、検索は次のようになります。

「arge ya AND arge yar AND rge yard .

于 2015-05-06T13:52:35.590 に答える