2

Elasticsearch (v2.3.3) の上に Web アプリを構築しました。クエリをフィルタリングするために、elasticsearch のポスト フィルターを使用しています。しかし、ポスト フィルターを使用すると、集約または差分フィルター処理を使用していないため、フィルター処理のパフォーマンス上の利点が失われることがわかりました。(参考:https ://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html )

これは私のelasticsearchクライアントがどのように見えるかです:

Client client = TransportClient.builder().build().addTransportAddress(
        new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),
            9300));
    SearchResponse response = client.prepareSearch("index_name")
        .setTypes("index_type")
        .setQuery(QueryBuilders.simpleQueryStringQuery(query)
            .field("newContent").field("T"))
        .setPostFilter(QueryBuilders.termQuery(Collection, true))
        .setFetchSource(new String[] { "U", "UE", "UD", "T" }, null)
        .setVersion(true).addHighlightedField("newContent").setFrom(0)
        .setSize(10).execute().actionGet();

また、フィルタリングされたクエリがelasticsearch 2.xバージョンで減価償却されていることも読みました。クエリを実行する前にフィルターを適用するのに役立つ他の方法はありますか? 明らかな何かが欠けている可能性があります。よろしくお願いします。

4

1 に答える 1

5

ポストフィルターに存在するフィルターをbool/filterクエリ内に持ち込むだけです。代わりにヒットを実行してみてください:

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
    .must(QueryBuilders.simpleQueryStringQuery(query)
              .field("newContent").field("T"))
    .filter(QueryBuilders.termQuery(Collection, true));

SearchResponse response = client.prepareSearch("index_name")
    .setTypes("index_type")
    .setQuery(boolQuery)
    .setFetchSource(new String[] { "U", "UE", "UD", "T" }, null)
    .setVersion(true).addHighlightedField("newContent").setFrom(0)
    .setSize(10).execute().actionGet();
于 2016-06-24T04:34:44.330 に答える