1

私はこれについてたくさん検索し、多くの組み合わせを試しました。しかし、すべての試みに失敗しました:(。

ここに私の問題があります: 以下のようにエラスティック検索で jdbc-river を作成しました:

{
    "type" : "jdbc",
    "jdbc" : {
        "driver" : "oracle.jdbc.driver.OracleDriver",
        "url" : "jdbc:oracle:thin:@//ip:1521/db",
        "user" : "user",
        "password" : "pwd",
        "sql" : "select f1, f2, f3 from table"
    },
    "index" : {
        "index" : "subject2",
        "type" : "name2",
        "settings": {
            "analysis": {
                "analyzer": {
                    "my_analizer": {
                        "type": "custom",
                        "tokenizer": "my_pattern_tokenizer",
                        "filter": []
                    }
                },
                "tokenizer": {
                    "my_pattern_tokenizer": {
                        "type": "pattern",
                        "pattern": "$^"
                    }
                },
                "filter": []
            }
        }
    },
    "mappings": 
    {
        "subject2": 
        {
            "properties" : {
                "f1" : {"index" : "not_analyzed", "store": "yes", "analyzer": "my_analizer", "search_analyzer": "keyword", "type": "string"},
                "f2" : {"index" : "not_analyzed", "store": "yes", "analyzer": "my_analizer", "search_analyzer": "keyword", "type": "string"},
                "f3" : {"index" : "not_analyzed", "store": "yes", "analyzer": "my_analizer", "search_analyzer": "keyword", "type": "string"}
            }
        }
    }
}

ユーザーが入力した値を「f1」フィールドのデータと一致させるオートコンプリート機能を、現時点では最初から実装したいと考えています。

f1 フィールドのデータは次のようになります

  • 「ハーディン郡ABC」
  • 「XYZの国」
  • 「ブラブラ郡」
  • 「カウンティ オブ ブラ セカンド」

要件に従っているのは、ユーザーが「Coun」と入力すると、結果の 2 番目、3 番目、および 4 番目が最初ではなくエラスティック検索によって返される必要があることです。完全な単語をトークンにする「キーワード」アナライザーについて読みましたが、この場合に機能しないことはわかりません。

また、ユーザーが「County of B」と入力すると、エラスティック検索によって 3 番目と 4 番目のオプションが返されます。

以下は、結果を照会する形式です。オプション1

{"from":0,"size":10, "query":{ "field" : { "f1" : "count*" } } }

オプション 2

{"from":0,"size":10, "query":{ "span_first" : {
        "match" : {
            "span_term" : { "COMPANY" : "hardin" }
        },
        "end" : 1
    } } }

私がここで何をしているのか教えてください。前もって感謝します。

4

3 に答える 3

0

ただし、最終的に実装したソリューションはアプローチの組み合わせですが、「ramseykhalaf」による回答が最も近いものです。彼に+1。

ユーザーがスペースを含む単語を入力したときに私がしたことは、一致プレフィックスクエリを起動し、最も近い一致結果を表示することです。

{"from":0,"size":10, "query":{ "match" : { "f1" : {"query" : "MICROSOU", "type" : "phrase_prefix", "boost":2} } } }

ユーザーがスペースの後に任意の文字をヒットするとすぐに、クエリのモードを正規表現を使用したクエリ フィールドに変更し、フィールド内の複数の単語が一致することは、ユーザーが探しているものに再び非常に近くなります。

{"from":0,"size":10, "query":{ "query_string" : { "default_field":"f1","query" : "micro int*", "boost":2 } } }

このようにして、この要件に最も近いソリューションが得られました。上記のユースケースを十分に満たす、より最適化されたソリューションを入手できれば幸いです。

もう 1 つ追加します。作成した川は、フィールドが「not_analyzed」、アナライザーが「keyword」のシンプルなプレーン バニラです。

于 2013-08-19T12:00:36.930 に答える
0

ngram フィルターを試しましたか? 文字長「n」の文字列をトークン化します。したがって、マッピングは次のようになります。

  {
    "settings": {
        "analysis": {
            "analyzer": {
                "autocomplete": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["standard", "lowercase", "kstem", "ngram"]
                }
            },
            "filter" : {
                "ngram" : {
                   "type": "ngram",
                   "min_gram": 2,
                   "max_gram": 15
                }
            }
        }
    },
    "mappings": {
        "subject2": {
            "properties" : {
                 "f1" : {
                    "type": "multi_field",
                     "fields": {
                         "f1": {
                             "type": "string"
                         },
                         "autocomplete": {
                             "analyzer": "autocomplete", 
                             "type": "string"
                         },
...

これにより、2 番目、3 番目、および 4 番目の結果の ngram "カウント" が返され、目的の結果が得られます。

「f1」をmulti_fieldフィールドにする必要はないことに注意してください。ただし、検索結果で「f1」を返す場合など、「オートコンプリート」アナライザーが必要ない場合は、「f1」サブフィールドを使用する方が安価です。"multi_field" を使用する場合、"f1" で "f1" (ドット表記なし) にアクセスできますが、"autocomplete" にアクセスするには、ドット表記を使用する必要があるため、"f1.autocomplete" になります。

于 2013-08-14T18:46:14.517 に答える