3

先行入力の提案のために、Elasticsearch にいくつかのドキュメントのインデックスを作成させようとしています。私が知る限り、Elasticsearch でのエッジ NGram 処理は、その下にある Lucene によって提供されます。残念ながら、この点に関する Lucene のドキュメントは、私には理解するのが非常に難しいことがわかっています。私が思いついた最高のものはhttps://gist.github.com/988923に基づいていますが、機能していないようです (これらの設定を使用したインデックスは、設定がなかったかのように、完全な単語の一致のみを返します)存在):

{
  "settings":{
    "index":{
      "analysis":{
        "analyzer":{
          "typeahead_analyzer":{
            "type":"custom",
            "tokenizer":"edgeNGram",
            "filter":["typeahead_ngram"]
          }
        },
        "filter":{
          "typeahead_ngram":{
            "type":"edgeNGram",
            "min_gram":1,
            "max_gram":8,
            "side":"front"
          }
        }
      }
    }
  }
}

アナライザー、トークナイザー、およびフィルターがどのように連携するのか、まったくわかりません。フィルターが必要ですか? トークナイザーが必要ですか?ドキュメントを使用するためにインデックスを作成するときに、これらの設定を参照する必要がありますか? その下の Lucene が特定のインデックスに使用している設定を確認するにはどうすればよいですか? これをデバッグするにはどうすればよいですか? ヘルプ :-)

4

1 に答える 1

1

edgeNGramを使用してこれを解決しました。以下は、これを達成するために使用したマッピングと分析です。

{
"analysis": {
    "analyzer": {
        "str_search_analyzer": {
            "tokenizer": "standard",
            "filter": [
                "lowercase"
            ]
        },
        "str_index_analyzer": {
            "tokenizer": "standard",
            "filter": [
                "lowercase",
                "substring"
            ]
        }
    },
    "filter": {
        "substring": {
            "type": "edgeNGram",
            "min_gram": 1,
            "max_gram": 10,
            "side": "front"
        }
    }
}

}

{
"index_name": {
    "properties": {
        "location": {
            "type": "geo_point"
        },
        "name": {
            "type": "string",
            "index": "analyzed",
            "search_analyzer": "str_search_analyzer",
            "index_analyzer": "str_index_analyzer"
        }
    }
}

}

重要な脚注は、AND 演算子を使用した一致クエリを使用して、これに対して適切にクエリを実行する必要があることです。

お役に立てれば。

于 2013-01-04T22:00:08.693 に答える