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中没有这么一个短语(顺序无差,且连接在一起),那么将查询不出任何结果。

五、上图

原文地址:https://www.cnblogs.com/songxingzhu/p/10066061.html