web-dev-qa-db-ja.com

elasticsearch-フィールドのトークンを返します

特定のフィールドのトークンを結果に返すにはどうすればよいですか?

たとえば、GETリクエスト

curl -XGET 'http://localhost:9200/Twitter/Tweet/1'

戻り値

{
    "_index" : "Twitter",
    "_type" : "Tweet",
    "_id" : "1", 
    "_source" : {
        "user" : "kimchy",
        "postDate" : "2009-11-15T14:12:12",
        "message" : "trying out Elastic Search"
    } 
}

結果に「_source.message」フィールドのトークンを含めたいのですが

21
Kennedy

次のscript_fieldsスクリプトを使用してこれを行う別の方法もあります。

curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{
    "query" : {
        "match_all" : { }
    },
    "script_fields": {
        "terms" : {
            "script": "doc[field].values",
            "params": {
                "field": "message"
            }
        }

    }
}'

このスクリプトはインデックス付けされた実際の用語を返しますが、すべてのフィールド値もキャッシュし、大きなインデックスでは大量のメモリを使用する可能性があることに注意してください。したがって、大きなインデックスでは、格納されているフィールドまたはソースからフィールド値を取得し、次のMVELスクリプトを使用してその場で再解析する方が便利な場合があります。

import org.Apache.lucene.analysis.tokenattributes.CharTermAttribute;
import Java.io.StringReader;

// Cache analyzer for further use
cachedAnalyzer=(isdef cachedAnalyzer)?cachedAnalyzer:doc.mapperService().documentMapper(doc._type.value).mappers().indexAnalyzer();

terms=[];
// Get value from Fields Lookup
//val=_fields[field].values;

// Get value from Source Lookup
val=_source[field];

if(val != null) {
  tokenStream=cachedAnalyzer.tokenStream(field, new StringReader(val)); 
  CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute); 
  while(tokenStream.incrementToken()) { 
    terms.add(termAttribute.toString())
  }; 
  tokenStream.close(); 
} 
terms

このMVELスクリプトはconfig/scripts/analyze.mvelとして保存でき、次のクエリで使用できます。

curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{
    "query" : {
        "match_all" : { }
    },
    "script_fields": {
        "terms" : {
            "script": "analyze",
            "params": {
                "field": "message"
            }
        }

    }
}'
29
imotov

インデックスが作成されたトークンを意味する場合は、メッセージフィールドに termsファセット を作成できます。より多くのエントリを取得するにはsize値を増やすか、すべての用語を取得するには0に設定します。

Luceneは用語ベクトルを格納する機能を提供しますが、今のところ(私が知る限り)elasticsearchでそれにアクセスする方法はありません。

なぜそれが必要なのですか?インデックスを作成しているものだけを確認したい場合は、 analyze api を参照してください。

7
javanna