Java調用Elasticsearch API查詢及matchPhraseQuery和matchQuery的區別


一、引入依賴

        <!--Elasticsearch client-->
        <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>transport-netty4-client</artifactId>
            <version>6.2.3</version>
        </dependency>

 

二、上代碼
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;

public class ElasticsearchTest {
    @Test
    public void queryTest() throws UnknownHostException {
        //集群設置
        //Settings settings = Settings.builder().put("cluster.name", "myClusterName").build();  //設置ES實例的名稱
        Settings settings = Settings.builder().put("client.transport.sniff", false).build();
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.4.141"), 9300));
        SearchRequestBuilder searchBuilder = client.prepareSearch("logstash-*").setSize(10).setFrom(0);
        searchBuilder.addSort("@timestamp", SortOrder.DESC);
        searchBuilder.setQuery(QueryBuilders.multiMatchQuery("Success", "logger_name", "message", "host"));
        searchBuilder.setQuery(QueryBuilders.matchPhraseQuery("level", "INFO"));
        searchBuilder.setQuery(QueryBuilders.matchPhraseQuery("appName", "backend-sync"));
        searchBuilder.setQuery(QueryBuilders.rangeQuery("@timestamp").from("2018-12-04T10:50:19.379Z").to("2018-12-04T10:58:19.379Z"));

        SearchResponse response = searchBuilder.execute().actionGet();
        System.out.println("TotalHits:" + response.getHits().getTotalHits());
        System.out.println("TotalHits Return:" + response.getHits().getHits().length);
        System.out.println("MaxScore:" + response.getHits().getMaxScore());
        for (SearchHit hit : response.getHits()) {
            Map<String, Object> map = hit.getSourceAsMap();
            if (map != null) {
                System.out.println(hit.getSourceAsString());
            }
        }
        client.close();
    }
}

三、查詢

說明:上文中,按timestamp倒序排列,並搜索日志中包含"Success"、Level級別為"INFO"的、AppName為"backend-sync",並取得查詢到的條數。

四、說明

matchPhraseQuery和matchQuery等的區別,在使用matchQuery等時,在執行查詢時,搜索的詞會被分詞器分詞,而使用matchPhraseQuery時,不會被分詞器分詞,而是直接以一個短語的形式查詢,而如果你在創建索引所使用的field的value中沒有這么一個短語(順序無差,且連接在一起),那么將查詢不出任何結果。

 

五、上圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM