2016-11-14 2 views
1

現在、インデックスの一部のフィールドについては、UIで検索対象のタイプを追加しています。ElasticsearchのIPデータ型で検索する場合

文字列フィールドの場合、Elasticsearchの機能はこれを行うためのさまざまな方法を可能にします。分析されたトークンまたはインデックス作成中のngramを使ってmatch_phrase_prefixクエリを実行します。

IPv4アドレスが内部でstored as longであるため、ワイルドカードまたはプレフィックスを検索することは、私が見る限り容易ではありません。

IP範囲の検索に範囲クエリを使用できますが、ユーザーに「118」を入力させ、「168.1.118.32」と「118.43.119.4」および「1.1 .1.118 "。

このようなクエリを実行する方法はありますか。あるいは、分析された文字列としてフィールドを別々に格納する必要がありますか?

+0

私はuがElasticSearch正規表現を使用して考えられてきた、この前に行っていませんか? https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-regexp-query.html – nafas

+0

@nafas:ありがとうございます、これはうまくいくようですが、私はこれを使用するのが嫌です何百万ものドキュメントがあるので、正規表現ではかなりのパフォーマンスが期待されます。文字列の場合、高価なワイルドカードと正規表現のマッチタイプを避けるために、接頭辞一致またはphrase-prefix-matchを使用します。 – centic

+0

静的な接頭辞(最初にワイルドカードを使用していない)をお持ちの場合、正直に言うと、パフォーマンス上のヒットはそれほどありません。私はElasticSearchで正規表現を使用していませんが、Solrで使用していますので、同様の動作が期待されます – nafas

答えて

0

さらに調査したところ、multi fieldを使用してIPアドレスを2回保存しました.1回は通常のIPタイプとして、もう1回は分析値としてIPを4オクテットに分割してこれらの部分を個別に検索できます。

我々は、インデックスへの書き込み時に値を分割するには、以下のパターンを使用したテンプレートで:

"analyzer": { 
     "ipv4analyzer": { 
     "tokenizer": "ipv4tokenizer" 
     } 
    }, 
    "tokenizer": { 
     "ipv4tokenizer": { 
     "pattern": "([0-9]{1,3})", 
     "type": "pattern", 
     "group": "1" 
     } 
    } 
関連する問題