10

ファセット用語を使用して、フィールドのすべての一意の値とその数を取得しています。そして、私は間違った結果を得ています。

term: web 
Count: 1191979 
term: misc 
Count: 1191979 
term: passwd 
Count: 1191979 
term: etc 
Count: 1191979 

実際の結果は次のようになります。

term: WEB-MISC /etc/passwd 
Count: 1191979 

これが私のサンプルクエリです:

{
  "facets": {
    "terms1": {
      "terms": {
        "field": "message"
      }
    }
  }
}
4

3 に答える 3

15

インデックスの再作成がオプションである場合は、マッピングを変更し、このフィールドをnot_analyzedとしてマークするのが最適です。

"your_field" : { "type": "string", "index" : "not_analyzed" }

フィールドの分析バージョンを保持する必要がある場合は、マルチフィールドタイプを使用できます。

"your_field" : {
  "type" : "multi_field",
    "fields" : {
      "your_field" : {"type" : "string", "index" : "analyzed"},
      "untouched" : {"type" : "string", "index" : "not_analyzed"}
  }
}

このようにして、を使用your_fieldしてファセット検索を実行しながら、クエリで引き続き使用できますyour_field.untouched

または、このフィールドが保存されている場合は、代わりにスクリプトフィールドファセットを使用できます。

"facets" : {
  "term" : {
    "terms" : {
      "script_field" : "_fields.your_field.value"
    }
  }
}

最後の手段として、このフィールドが保存されていないが、レコードソースがインデックスに保存されている場合は、次のことを試すことができます。

"facets" : {
  "term" : {
    "terms" : {
      "script_field" : "_source.your_field"
    }
  }
}

最初の解決策が最も効率的です。最後の解決策は最も効率が悪く、大きなインデックスでは多くの時間がかかる可能性があります。

于 2012-04-10T17:57:41.877 に答える
0

うわー、最近のエラスティック検索で用語を集約しているときに、今日も同じ問題が発生しました。グーグルと部分的な理解の後、このオタクなインデックス作成がどのように機能するかを見つけました(これは非常に簡単です)。

クエリは、転置インデックスに実際に存在する用語のみを見つけることができます

次の文字列にインデックスを付ける場合

"WEB-MISC /etc/passwd"

アナライザーに渡されます。アナライザーはそれをトークン化する可能性があります

"WEB", "MISC", "etc" and "passwd" 

その位置の詳細で。そして、このトークンは、次のような小文字にフィルタリングされる可能性があります

"web", "misc", "etc" and "passwd"

したがって、インデックスを作成した後、検索クエリは上記の4つのみを表示できます。「WEB-MISC/etc/passwd」という完全な単語ではありません。あなたの要件のために、以下はあなたが使うことができる私のオプションです

1.Change the Default Analyzer used by elasticsearch([link][1])
2.If it is not need, just TurnOff the analyzer by setting 'not_analyzed' for the fields you need
3.To convert the already indexed data searchable, re-indexing is the only option
于 2016-01-06T15:32:25.420 に答える
-1

この問題について簡単に説明し、ここで2つの解決策を提案しました。ここでは複数のアプローチについて話しました。1つは、not_analyzedを使用して、文字列をそのまま保持することです。ただし、大文字と小文字が区別されないという欠点があるため、キーワードトークナイザーと小文字のフィルターを使用することをお勧めします。

于 2015-10-09T10:35:44.593 に答える