ElasticSearch搜索实例含高亮显示及搜索的特殊字符过滤

来源:互联网 发布:武汉医院网络总监招聘 编辑:程序博客网 时间:2024/06/06 11:56
ElasticSearch搜索实例含高亮显示及搜索的特殊字符过滤

另:介绍一个关于es的网址:http://elasticsearch.cn/


应用说明见代码注解。


1.简单搜索实例展示:


    public void search() throws IOException {
        // 自定义集群结点名称
        String clusterName = "elasticsearch_pudongping";


        // 获取客户端
        Client client = ESClient.initClient(clusterName);


        // 创建查询索引,参数productindex表示要查询的索引库为productindex
        SearchRequestBuilder searchRequestBuilder = client
                .prepareSearch("productindex");


        // 设置查询索引类型,setTypes("productType1", "productType2","productType3");
        // 用来设定在多个类型中搜索
        searchRequestBuilder.setTypes("productIndex");


        // 设置查询类型 1.SearchType.DFS_QUERY_THEN_FETCH = 精确查询 2.SearchType.SCAN =
        // 扫描查询,无序
        searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);


        // 设置查询关键词
        searchRequestBuilder
                .setQuery(QueryBuilders.fieldQuery("title", "Acer"));


        // 查询过滤器过滤价格在4000-5000内 这里范围为[4000,5000]区间闭包含,搜索结果包含价格为4000和价格为5000的数据
        searchRequestBuilder.setFilter(FilterBuilders.rangeFilter("price")
                .from(4000).to(5000));


        // 分页应用
        searchRequestBuilder.setFrom(0).setSize(60);


        // 设置是否按查询匹配度排序
        searchRequestBuilder.setExplain(true);


        // 执行搜索,返回搜索响应信息
        SearchResponse response = searchRequestBuilder.execute().actionGet();


        SearchHits searchHits = response.getHits();
        SearchHit[] hits = searchHits.getHits();
        for (int i = 0; i < hits.length; i++) {
            SearchHit hit = hits[i];
            Map<String, Object> result = hit.getSource();
            // 打印map集合:{id=26, onSale=true, title=宏基Acer乐3, price=4009.0,
            // description=null, createDate=1380530123140, type=2}
            System.out.println(result);
        }
        System.out.println("search success ..");


    }


说明:


client.prepareSearch用来创建一个SearchRequestBuilder,搜索即由SearchRequestBuilder执行。


client.prepareSearch方法有参数为一个或多个index,表现在数据库中,即零个或多个数据库名,你既可以使用(下面两个都可以表示在多个索引库中查找):


client.prepareSearch().setIndices("index1","index2","index3","index4");


或者:


client.prepareSearch("index1","index2","index3","index4");


SearchRequestBuilder常用方法说明:


(1) setIndices(String... indices):上文中描述过,参数可为一个或多个字符串,表示要进行检索的index;


(2) setTypes(String... types):参数可为一个或多个字符串,表示要进行检索的type,当参数为0个或者不调用此方法时,表示查询所有的type;


setSearchType(SearchType searchType):执行检索的类别,值为org.elasticsearch.action.search.SearchType的元素,SearchType是一个枚举类型的类,
  其值如下所示:
  QUERY_THEN_FETCH:查询是针对所有的块执行的,但返回的是足够的信息,而不是文档内容(Document)。结果会被排序和分级,基于此,只有相关的块的文档对象会被返回。由于被取到的仅仅是这些,故而返回的hit的大小正好等于指定的size。这对于有许多块的index来说是很便利的(返回结果不会有重复的,因为块被分组了)
  QUERY_AND_FETCH:最原始(也可能是最快的)实现就是简单的在所有相关的shard上执行检索并返回结果。每个shard返回一定尺寸的结果。由于每个shard已经返回了一定尺寸的hit,这种类型实际上是返回多个shard的一定尺寸的结果给调用者。
  DFS_QUERY_THEN_FETCH:与QUERY_THEN_FETCH相同,预期一个初始的散射相伴用来为更准确的score计算分配了的term频率。
  DFS_QUERY_AND_FETCH:与QUERY_AND_FETCH相同,预期一个初始的散射相伴用来为更准确的score计算分配了的term频率。
  SCAN:在执行了没有进行任何排序的检索时执行浏览。此时将会自动的开始滚动结果集。
  COUNT:只计算结果的数量,也会执行facet。


(4) setSearchType(String searchType),与setSearchType(SearchType searchType)类似,区别在于其值为字符串型的SearchType,值可为dfs_query_then_fetch、dfsQueryThenFetch、dfs_query_and_fetch、dfsQueryAndFetch、query_then_fetch、queryThenFetch、query_and_fetch或queryAndFetch;


(5) setScroll(Scroll scroll)、setScroll(TimeValue keepAlive)和setScroll(String keepAlive),设置滚动,参数为Scroll时,直接用new Scroll(TimeValue)构造一个Scroll,为TimeValue或String时需要将TimeValue和String转化为Scroll;


(6) setTimeout(TimeValue timeout)和setTimeout(String timeout),设置搜索的超时时间;


(7) setQuery,设置查询使用的Query;


(8) setFilter,设置过滤器;


(9) setMinScore,设置Score的最小数量;


(10) setFrom,从哪一个Score开始查;


(11) setSize,需要查询出多少条结果;


检索出结果后,通过response.getHits()可以得到所有的SearchHit,得到Hit后,便可迭代Hit取到对应的Document,转化成为需要的实体。


2.搜索高亮显示


SearchRequestBuilder中的addHighlightedField()方法可以定制在哪个域值的检索结果的关键字上增加高亮


    public void search() throws IOException {
        // 自定义集群结点名称
        String clusterName = "elasticsearch_pudongping";
        
        // 获取客户端
        Client client = ESClient.initClient(clusterName);   


        // 创建查询索引,参数productindex表示要查询的索引库为productindex
        SearchRequestBuilder searchRequestBuilder = client
                .prepareSearch("productindex");


        // 设置查询索引类型,setTypes("productType1", "productType2","productType3");
        // 用来设定在多个类型中搜索
        searchRequestBuilder.setTypes("productIndex");


        // 设置查询类型 1.SearchType.DFS_QUERY_THEN_FETCH = 精确查询 2.SearchType.SCAN = 扫描查询,无序
        searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);


        // 设置查询关键词
        searchRequestBuilder
                .setQuery(QueryBuilders.fieldQuery("title", "Acer"));


        // 查询过滤器过滤价格在4000-5000内 这里范围为[4000,5000]区间闭包含,搜索结果包含价格为4000和价格为5000的数据
        searchRequestBuilder.setFilter(FilterBuilders.rangeFilter("price")
                .from(4000).to(5000));


        // 分页应用
        searchRequestBuilder.setFrom(0).setSize(60);


        // 设置是否按查询匹配度排序
        searchRequestBuilder.setExplain(true);
        
        //设置高亮显示
        searchRequestBuilder.addHighlightedField("title");
        searchRequestBuilder.setHighlighterPreTags("<span style=\"color:red\">");
        searchRequestBuilder.setHighlighterPostTags("</span>");
        // 执行搜索,返回搜索响应信息
        SearchResponse response = searchRequestBuilder.execute().actionGet();
        
        //获取搜索的文档结果
        SearchHits searchHits = response.getHits();
        SearchHit[] hits = searchHits.getHits();
        ObjectMapper mapper = new ObjectMapper();
        for (int i = 0; i < hits.length; i++) {
            SearchHit hit = hits[i];
            //将文档中的每一个对象转换json串值
            String json = hit.getSourceAsString();
            //将json串值转换成对应的实体对象
            Product product = mapper.readValue(json, Product.class);  
            
            //获取对应的高亮域
            Map<String, HighlightField> result = hit.highlightFields();    
            //从设定的高亮域中取得指定域
            HighlightField titleField = result.get("title");  
            //取得定义的高亮标签
            Text[] titleTexts =  titleField.fragments();    
            //为title串值增加自定义的高亮标签
            String title = "";  
            for(Text text : titleTexts){    
                  title += text;  
            }
            //将追加了高亮标签的串值重新填充到对应的对象
            product.setTitle(title);
            //打印高亮标签追加完成后的实体对象
            System.out.println(product);
        }
        System.out.println("search success ..");


    }


程序运行结果:


[id=8,title=宏基<span style="color:red">Acer</span>,description=宏基Acer蜂鸟系列,price=5000.0,onSale=true,type=1,createDate=Mon Sep 30 13:46:41 CST 2013]
[id=21,title=宏基<span style="color:red">Acer</span>,description=宏基Acer蜂鸟系列,price=5000.0,onSale=true,type=1,createDate=Mon Sep 30 13:48:17 CST 2013]
[id=7,title=宏基<span style="color:red">Acer</span>,description=宏基Acer蜂鸟系列,price=5000.0,onSale=true,type=1,createDate=Mon Sep 30 11:38:50 CST 2013]
[id=5,title=宏基<span style="color:red">Acer</span>乐0,description=<null>,price=4000.0,onSale=true,type=1,createDate=Mon Sep 30 16:35:23 CST 2013]
[id=12,title=宏基<span style="color:red">Acer</span>乐1,description=<null>,price=4003.0,onSale=false,type=2,createDate=Mon Sep 30 16:35:23 CST 2013]
[id=19,title=宏基<span style="color:red">Acer</span>乐2,description=<null>,price=4006.0,onSale=false,type=1,createDate=Mon Sep 30 16:35:23 CST 2013]
[id=26,title=宏基<span style="color:red">Acer</span>乐3,description=<null>,price=4009.0,onSale=true,type=2,createDate=Mon Sep 30 16:35:23 CST 2013]
[id=33,title=宏基<span style="color:red">Acer</span>乐4,description=<null>,price=4012.0,onSale=false,type=1,createDate=Mon Sep 30 16:35:23 CST 2013]


从程序执行结果中我们可以看到,我们定义的高亮标签已经追加到指定的域上了.


当搜索索引的时候,你搜索关键字包含了特殊字符,那么程序就会报错


// fieldQuery 这个必须是你的索引字段哦,不然查不到数据,这里我只设置两个字段 id ,title
String title = "title+-&&||!(){}[]^\"~*?:\\";
title = QueryParser.escape(title);// 主要就是这一句把特殊字符都转义,那么lucene就可以识别
searchRequestBuilder.setQuery(QueryBuilders.fieldQuery("title", title));


Elasticsearch安装使用教程 http://www.linuxidc.com/Linux/2015-02/113615.htm


ElasticSearch 配置文件译文解析 http://www.linuxidc.com/Linux/2015-02/114244.htm


ElasticSearch集群搭建实例  http://www.linuxidc.com/Linux/2015-02/114243.htm


分布式搜索ElasticSearch单机与服务器环境搭建  http://www.linuxidc.com/Linux/2012-05/60787.htm


ElasticSearch的工作机制  http://www.linuxidc.com/Linux/2014-11/109922.htm


ElasticSearch 的详细介绍:请点这里
ElasticSearch 的下载地址:请点这里
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 把闺蜜生日忘了怎么办 忘了闺蜜的生日怎么办 一岁宝宝不吃菜怎么办 幼儿园教案虫子爬进耳朵怎么办 鼻子出血怎么办幼儿说课 英语记不住发音不准怎么办 幼儿园孩子拼音记不住怎么办 孩子总是记不住东西怎么办 走丢了怎么办小班教案 走丢了怎么办小班社会 数学加减个十分不清怎么办 孩子b和d分不清怎么办 小孩b和d分不清怎么办 高一的数学不会怎么办 农村小孩到市里上学怎么办 和外国人打官司输了怎么办 碰见爱说你的领导怎么办 小孩脾气爆一句话就生气怎么办 小孩眼睛哭肿了怎么办 大人吵架吓到宝宝了怎么办 小孩晚上睡觉不踏实怎么办 二宝美籍大宝怎么办 小孩一洗澡就哭怎么办 孩子去外地上学学籍怎么办 非婚生子父亲想要孩子怎么办 非婚生子孩子父亲找不到了怎么办 3岁半宝宝认字怎么办 上课注意力不集中老是发呆怎么办 海绵宝宝吃了会怎么办 宝宝误吞李子核怎么办 24个月宝宝不愿意说话怎么办 孩子凉着肚子吐怎么办 教宝宝说话不会说怎么办 2岁宝宝语言退化怎么办 两周宝宝嗓子哑怎么办 幼儿园孩子上课爱说话老师怎么办 一岁宝宝不会爬怎么办 孩子说话不太清楚怎么办 十一个月宝宝不爱吃饭怎么办 14个月宝宝不爱吃饭怎么办 一岁宝宝喜欢哭怎么办