`
weitao1026
  • 浏览: 1062517 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用 Java 操作 elasticsearch - 简单搜索

 
阅读更多

/**

 * 系统环境: vm12 下的centos 7.2

 * 当前安装版本: elasticsearch-2.4.0.tar.gz

 */

QueryBuilder 是es中提供的一个查询接口, 可以对其进行参数设置来进行查用擦还训

 

复制代码
package com.wenbronk.javaes;

import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map.Entry;

import org.elasticsearch.action.ListenableActionFuture;
import org.elasticsearch.action.get.GetRequestBuilder;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.IndicesQueryBuilder;
import org.elasticsearch.index.query.NestedQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.index.query.SpanFirstQueryBuilder;
import org.elasticsearch.index.query.WildcardQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.junit.Before;
import org.junit.Test;

/**
 * java操作查询api
 * @author 231
 *
 */
public class JavaESQuery {
    
    private TransportClient client;
    
    @Before
    public void testBefore() {
        Settings settings = Settings.settingsBuilder().put("cluster.name", "wenbronk_escluster").build();
        client = TransportClient.builder().settings(settings).build()
                 .addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("192.168.50.37", 9300)));
        System.out.println("success to connect escluster");
    }

    /**
     * 使用get查询
     */
    @Test
    public void testGet() {
        GetRequestBuilder requestBuilder = client.prepareGet("twitter", "tweet", "1");
        GetResponse response = requestBuilder.execute().actionGet();
        GetResponse getResponse = requestBuilder.get();
        ListenableActionFuture<GetResponse> execute = requestBuilder.execute();
        System.out.println(response.getSourceAsString());
    }
    
    /**
     * 使用QueryBuilder
     * termQuery("key", obj) 完全匹配
     * termsQuery("key", obj1, obj2..)   一次匹配多个值
     * matchQuery("key", Obj) 单个匹配, field不支持通配符, 前缀具高级特性
     * multiMatchQuery("text", "field1", "field2"..);  匹配多个字段, field有通配符忒行
     * matchAllQuery();         匹配所有文件
     */
    @Test
    public void testQueryBuilder() {
//        QueryBuilder queryBuilder = QueryBuilders.termQuery("user", "kimchy");
      QueryBUilder queryBuilder = QueryBuilders.termQuery("user", "kimchy", "wenbronk", "vini");
        QueryBuilders.termsQuery("user", new ArrayList<String>().add("kimchy"));
//        QueryBuilder queryBuilder = QueryBuilders.matchQuery("user", "kimchy");
//        QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("kimchy", "user", "message", "gender");
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
        searchFunction(queryBuilder);
        
    }
    
    /**
     * 组合查询
     * must(QueryBuilders) :   AND
     * mustNot(QueryBuilders): NOT
     * should:                  : OR
     */
    @Test
    public void testQueryBuilder2() {
        QueryBuilder queryBuilder = QueryBuilders.boolQuery()
            .must(QueryBuilders.termQuery("user", "kimchy"))
            .mustNot(QueryBuilders.termQuery("message", "nihao"))
            .should(QueryBuilders.termQuery("gender", "male"));
        searchFunction(queryBuilder);
    }
    
    /**
     * 只查询一个id的
     * QueryBuilders.idsQuery(String...type).ids(Collection<String> ids)
     */
    @Test
    public void testIdsQuery() {
        QueryBuilder queryBuilder = QueryBuilders.idsQuery().ids("1");
        searchFunction(queryBuilder);
    }
    
    /**
     * 包裹查询, 高于设定分数, 不计算相关性
     */
    @Test
    public void testConstantScoreQuery() {
        QueryBuilder queryBuilder = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("name", "kimchy")).boost(2.0f);
        searchFunction(queryBuilder);
        // 过滤查询
//        QueryBuilders.constantScoreQuery(FilterBuilders.termQuery("name", "kimchy")).boost(2.0f);
        
    }
    
    /**
     * disMax查询
     * 对子查询的结果做union, score沿用子查询score的最大值, 
     * 广泛用于muti-field查询
     */
    @Test
    public void testDisMaxQuery() {
        QueryBuilder queryBuilder = QueryBuilders.disMaxQuery()
            .add(QueryBuilders.termQuery("user", "kimch"))  // 查询条件
            .add(QueryBuilders.termQuery("message", "hello"))
            .boost(1.3f)
            .tieBreaker(0.7f);
        searchFunction(queryBuilder);
    }
    
    /**
     * 模糊查询
     * 不能用通配符, 不知道干啥用
     */
    @Test
    public void testFuzzyQuery() {
        QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("user", "kimch");
        searchFunction(queryBuilder);
    }
    
    /**
     * 父或子的文档查询
     */
    @Test
    public void testChildQuery() {
        QueryBuilder queryBuilder = QueryBuilders.hasChildQuery("sonDoc", QueryBuilders.termQuery("name", "vini"));
        searchFunction(queryBuilder);
    }
    
    /**
     * moreLikeThisQuery: 实现基于内容推荐, 支持实现一句话相似文章查询
     * {   
        "more_like_this" : {   
        "fields" : ["title", "content"],   // 要匹配的字段, 不填默认_all
        "like_text" : "text like this one",   // 匹配的文本
        }   
    }     
    
    percent_terms_to_match:匹配项(term)的百分比,默认是0.3

    min_term_freq:一篇文档中一个词语至少出现次数,小于这个值的词将被忽略,默认是2
    
    max_query_terms:一条查询语句中允许最多查询词语的个数,默认是25
    
    stop_words:设置停止词,匹配时会忽略停止词
    
    min_doc_freq:一个词语最少在多少篇文档中出现,小于这个值的词会将被忽略,默认是无限制
    
    max_doc_freq:一个词语最多在多少篇文档中出现,大于这个值的词会将被忽略,默认是无限制
    
    min_word_len:最小的词语长度,默认是0
    
    max_word_len:最多的词语长度,默认无限制
    
    boost_terms:设置词语权重,默认是1
    
    boost:设置查询权重,默认是1
    
    analyzer:设置使用的分词器,默认是使用该字段指定的分词器
     */
    @Test
    public void testMoreLikeThisQuery() {
        QueryBuilder queryBuilder = QueryBuilders.moreLikeThisQuery("user")
                            .like("kimchy");
//                            .minTermFreq(1)         //最少出现的次数
//                            .maxQueryTerms(12);        // 最多允许查询的词语
        searchFunction(queryBuilder);
    }
    
    /**
     * 前缀查询
     */
    @Test
    public void testPrefixQuery() {
        QueryBuilder queryBuilder = QueryBuilders.matchQuery("user", "kimchy");
        searchFunction(queryBuilder);
    }
    
    /**
     * 查询解析查询字符串
     */
    @Test
    public void testQueryString() {
        QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("+kimchy");
        searchFunction(queryBuilder);
    }
    
    /**
     * 范围内查询
     */
    public void testRangeQuery() {
        QueryBuilder queryBuilder = QueryBuilders.rangeQuery("user")
            .from("kimchy")
            .to("wenbronk")
            .includeLower(true)     // 包含上界
            .includeUpper(true);      // 包含下届
        searchFunction(queryBuilder);
    }
    
    /**
     * 跨度查询
     */
    @Test
    public void testSpanQueries() {
         QueryBuilder queryBuilder1 = QueryBuilders.spanFirstQuery(QueryBuilders.spanTermQuery("name", "葫芦580娃"), 30000);     // Max查询范围的结束位置  
      
         QueryBuilder queryBuilder2 = QueryBuilders.spanNearQuery()  
                .clause(QueryBuilders.spanTermQuery("name", "葫芦580娃")) // Span Term Queries  
                .clause(QueryBuilders.spanTermQuery("name", "葫芦3812娃"))  
                .clause(QueryBuilders.spanTermQuery("name", "葫芦7139娃"))  
                .slop(30000)                                               // Slop factor  
                .inOrder(false)  
                .collectPayloads(false);  
  
        // Span Not
         QueryBuilder queryBuilder3 = QueryBuilders.spanNotQuery()  
                .include(QueryBuilders.spanTermQuery("name", "葫芦580娃"))  
                .exclude(QueryBuilders.spanTermQuery("home", "山西省太原市2552街道"));  
  
        // Span Or   
         QueryBuilder queryBuilder4 = QueryBuilders.spanOrQuery()  
                .clause(QueryBuilders.spanTermQuery("name", "葫芦580娃"))  
                .clause(QueryBuilders.spanTermQuery("name", "葫芦3812娃"))  
                .clause(QueryBuilders.spanTermQuery("name", "葫芦7139娃"));  
  
        // Span Term  
         QueryBuilder queryBuilder5 = QueryBuilders.spanTermQuery("name", "葫芦580娃");  
    }
    
    /**
     * 测试子查询
     */
    @Test
    public void testTopChildrenQuery() {
        QueryBuilders.hasChildQuery("tweet", 
                QueryBuilders.termQuery("user", "kimchy"))
            .scoreMode("max");
    }
    
    /**
     * 通配符查询, 支持 * 
     * 匹配任何字符序列, 包括空
     * 避免* 开始, 会检索大量内容造成效率缓慢
     */
    @Test
    public void testWildCardQuery() {
        QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("user", "ki*hy");
        searchFunction(queryBuilder);
    }
    
    /**
     * 嵌套查询, 内嵌文档查询
     */
    @Test
    public void testNestedQuery() {
        QueryBuilder queryBuilder = QueryBuilders.nestedQuery("location", 
                QueryBuilders.boolQuery()
                    .must(QueryBuilders.matchQuery("location.lat", 0.962590433140581))
                    .must(QueryBuilders.rangeQuery("location.lon").lt(36.0000).gt(0.000)))
        .scoreMode("total");
        
    }
    
    /**
     * 测试索引查询
     */
    @Test
    public void testIndicesQueryBuilder () {
        QueryBuilder queryBuilder = QueryBuilders.indicesQuery(
                QueryBuilders.termQuery("user", "kimchy"), "index1", "index2")
                .noMatchQuery(QueryBuilders.termQuery("user", "kimchy"));
        
    }
    
    
    
    /**
     * 查询遍历抽取
     * @param queryBuilder
     */
    private void searchFunction(QueryBuilder queryBuilder) {
        SearchResponse response = client.prepareSearch("twitter")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setScroll(new TimeValue(60000))
                .setQuery(queryBuilder)
                .setSize(100).execute().actionGet();
        
        while(true) {
            response = client.prepareSearchScroll(response.getScrollId())
                .setScroll(new TimeValue(60000)).execute().actionGet();
            for (SearchHit hit : response.getHits()) {
                Iterator<Entry<String, Object>> iterator = hit.getSource().entrySet().iterator();
                while(iterator.hasNext()) {
                    Entry<String, Object> next = iterator.next();
                    System.out.println(next.getKey() + ": " + next.getValue());
                    if(response.getHits().hits().length == 0) {
                        break;
                    }
                }
            }
            break;
        }
//        testResponse(response);
    }
    
    /**
     * 对response结果的分析
     * @param response
     */
    public void testResponse(SearchResponse response) {
        // 命中的记录数
        long totalHits = response.getHits().totalHits();
        
        for (SearchHit searchHit : response.getHits()) {
            // 打分
            float score = searchHit.getScore();
            // 文章id
            int id = Integer.parseInt(searchHit.getSource().get("id").toString());
            // title
            String title = searchHit.getSource().get("title").toString();
            // 内容
            String content = searchHit.getSource().get("content").toString();
            // 文章更新时间
            long updatetime = Long.parseLong(searchHit.getSource().get("updatetime").toString());
        }
    }
    
    /**
     * 对结果设置高亮显示
     */
    public void testHighLighted() {
        /*  5.0 版本后的高亮设置
         * client.#().#().highlighter(hBuilder).execute().actionGet();
        HighlightBuilder hBuilder = new HighlightBuilder();
        hBuilder.preTags("<h2>");
        hBuilder.postTags("</h2>");
        hBuilder.field("user");        // 设置高亮显示的字段
        */
        // 加入查询中
        SearchResponse response = client.prepareSearch("blog")
            .setQuery(QueryBuilders.matchAllQuery())
            .addHighlightedField("user")        // 添加高亮的字段
            .setHighlighterPreTags("<h1>")
            .setHighlighterPostTags("</h1>")
            .execute().actionGet();
        
        // 遍历结果, 获取高亮片段
        SearchHits searchHits = response.getHits();
        for(SearchHit hit:searchHits){
            System.out.println("String方式打印文档搜索内容:");
            System.out.println(hit.getSourceAsString());
            System.out.println("Map方式打印高亮内容");
            System.out.println(hit.getHighlightFields());

            System.out.println("遍历高亮集合,打印高亮片段:");
            Text[] text = hit.getHighlightFields().get("title").getFragments();
            for (Text str : text) {
                System.out.println(str.string());
            }
        }
    }
}
分享到:
评论

相关推荐

    elasticsearch-6.8.0+elasticsearch-analysis-ik-6.8.0 .zip

    Spring Data 提供的注解使得操作 Elasticsearch 如同操作数据库一样简单,提高了开发效率。 **搜索引擎的构建:** 构建基于 Elasticsearch 的搜索引擎涉及以下步骤: 1. **安装与配置**:部署 Elasticsearch 集群...

    最新版windows elasticsearch-7.15.2-windows-x86_64.zip

    Elasticsearch基于Lucene构建,它将Lucene的搜索功能封装成易于使用的RESTful API。这使得开发者可以轻松地在应用程序中集成强大的搜索功能,而无需深入理解复杂的搜索引擎底层技术。Elasticsearch具有分布式、实时...

    elasticsearch-7.17.3

    Elasticsearch 7.17.3 是一个高度可扩展的开源全文搜索引擎,以其强大的分布式、实时搜索和分析能力而闻名。它基于Lucene构建,但提供了更高级别的API和服务,使得管理和操作大规模数据变得更加简单。这个版本的...

    elasticsearch-analysis-dynamic-synonym-7.0.0.zip

    Elasticsearch是一个强大的开源搜索引擎,广泛应用于数据存储和分析领域。为了增强其对文本的处理能力,特别是中文分词和语义理解,开发者通常会利用各种插件来扩展其功能。"elasticsearch-analysis-dynamic-synonym...

    elasticsearch-analysis-ik-6.8.0.zip

    Elasticsearch 分析插件 IK 分词器是用于优化 Elasticsearch 搜索引擎中文处理的重要工具。在中文环境下,正确的分词对于提升搜索质量和精确性至关重要。IK 分词器因其高效的性能和丰富的自定义功能,在 Elastic...

    最新版 elasticsearch-analysis-ik-7.10.2.zip

    《Elasticsearch Analysis IK插件7.10.2版详解》 Elasticsearch Analysis IK插件是针对Elasticsearch的中文分词器,它的全称为"elasticsearch-analysis-ik",在7.10.2版本中,该插件为用户提供了更强大的中文处理...

    elasticsearch-7.4.2-linux-x86_64.tar.gz

    5. RESTful API:Elasticsearch 使用 RESTful 风格的 API 进行操作,使得与各种编程语言的集成变得简单,通过 HTTP 协议即可进行数据的增删改查和搜索操作。 6. 插件支持:Elasticsearch 社区提供了丰富的插件,...

    JAVA实现ElasticSearch的简单实例

    7. **Java REST客户端的使用**:`RestHighLevelClient`是Elasticsearch提供的高级Java客户端,提供了丰富的API用于操作索引、文档、搜索等。创建客户端实例需要提供ES服务器的URL,可以设置连接参数如超时、重试策略...

    elasticsearch-7.17.7-windows-x86-64.zip

    Elasticsearch是一个强大的开源搜索引擎,基于Java开发,其核心功能是全文检索,但同时也提供了数据分析、实时聚合以及数据存储的能力。这个"elasticsearch-7.17.7-windows-x86-64.zip"文件是Elasticsearch的7.17.7...

    (狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战)

    (狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战),包含了小狂神讲的东西,特别适合新手学习,笔记保存下来可以多看看。好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个...

    elasticsearch-7.9.0-linux-x86_64.rar

    - **RESTful API**:Elasticsearch基于HTTP和JSON,提供了一套简单易用的RESTful接口,方便开发者进行索引、搜索、聚合等操作。 - **实时性**:Elasticsearch在数据被索引时就可搜索,无需额外的刷新操作,这使得...

    最新版windows elasticsearch-8.5.2-windows-x86-64.zip

    开发者可以用任何支持HTTP的编程语言来操作Elasticsearch,如Python、Java、JavaScript等。 4. **数据结构丰富**:除了支持文本搜索,Elasticsearch还支持数值、地理位置、日期等不同数据类型的索引,方便处理复杂...

    最新版windows elasticsearch-8.2.0-windows-x86_64.zip

    在Windows平台上,Elasticsearch的8.2.0版本是为64位操作系统设计的,提供了强大的搜索和数据分析功能。这个压缩包“elasticsearch-8.2.0-windows-x86_64.zip”包含了在Windows系统上运行Elasticsearch所需的所有...

    elasticsearch-6.8.18.rar(elasticsearch-6.8.18.zip)

    2. RESTful API:Elasticsearch采用RESTful风格的HTTP接口,使用户可以通过简单的HTTP请求进行索引、搜索、更新和删除操作,极大地简化了与搜索引擎的交互。 3. 全文搜索:Elasticsearch支持丰富的全文检索功能,...

    elasticsearch-7.5.2-linux-x86_64.tar.gz

    Elasticsearch 7.5.2 是一个高度可扩展的开源全文搜索引擎,广泛应用于数据分析、日志聚合和实时搜索场景。这个版本的压缩包“elasticsearch-7.5.2-linux-x86_64.tar.gz”是为Linux 64位系统优化的,包含了在该操作...

    elasticsearch-analysis-pinyin-7.1.0.zip

    Elasticsearch(ES)是一种流行的开源全文搜索引擎,它基于Lucene构建,提供了分布式、近实时的搜索和分析功能。在中文环境下,为了更好地处理和理解中文文本,我们需要使用特定的分析器。"elasticsearch-analysis-...

    elasticsearch-7.15.2-windows-x86_64位

    - `bin`目录:包含可执行文件,如`elasticsearch.bat`启动脚本,以及用于管理和操作Elasticsearch的命令行工具。 - `config`目录:存储配置文件,如`elasticsearch.yml`,在这里你可以设置Elasticsearch的各项参数。...

    最新版linux elasticsearch-8.3.2-linux-x86_64.tar.gz

    14. **启动与管理**:通过`bin/elasticsearch`脚本启动服务,使用`bin/elasticsearch-cli`进行管理操作,如查看状态、停止服务等。 15. **数据导入与搜索**:可以使用`curl`命令或者客户端库(如Python的`elastic...

    java操作elasticsearch5.x的demo

    Java操作Elasticsearch 5.x的Demo详解 在大数据时代,Elasticsearch作为一个高效、可扩展的全文搜索引擎,被广泛应用于日志分析、实时...希望这个简单的Java操作Elasticsearch 5.x的Demo能帮助你开始这段探索之旅。

    elasticsearch7.8.0.zip

    通过elasticsearch-head可以直观地查看Elasticsearch节点的状态、索引信息,以及进行简单的数据操作,如搜索、监控集群健康状况等。 为了保证ELK堆栈的稳定运行,还需要考虑监控和维护方面,例如定期检查硬件资源...

Global site tag (gtag.js) - Google Analytics