Elasticsearch 5.1.1搜索高亮及Java API实现
2017-11-27 14:57
211 查看
5.1.1的搜索高亮和2.X有所变化,但是变化不大。下面分四步来介绍:创建索引(设置mapping/IK分词)、索引文档、REST API的搜索高亮、JAVA API的搜索高亮。
注:从这篇博客开始,采用简写的代码风格,也就是Sence插件或者kibana的dev tools中采用的风格。(温馨提示:安装kibana 5.1.1,在dev tools中直接可以使用简单格式命令。)
文档结构为blog/article/id。先创建一个空的index:
创建mapping:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
加入三条文档到blog索引。
文档1:
2
3
4
5
文档2:
2
3
4
5
文档3:
2
3
4
5
我们查询title中含有java的文档,并用自定义高亮片段标记出来。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
查询结果:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
jar包导入请参考前面的的一篇博客Elasticsearch 5.X下JAVA API使用指南
写一个测试类:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
运行结果:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
截图如下:
注:从这篇博客开始,采用简写的代码风格,也就是Sence插件或者kibana的dev tools中采用的风格。(温馨提示:安装kibana 5.1.1,在dev tools中直接可以使用简单格式命令。)
一、创建索引
文档结构为blog/article/id。先创建一个空的index:PUT blog1
创建mapping:
POST blog/article/_mapping { "article": { "properties": { "title": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "boost": 8 }, "content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "boost": 4 } } } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
二、索引测试文档
加入三条文档到blog索引。 文档1:
POST blog/article/1 { "title":"java编程思想", "content":"《Java编程思想》这本书赢得了全球程序员的广泛赞誉" }1
2
3
4
5
文档2:
POST blog/article/2 { "title":"手把手教你使用Git", "content":"这是一个非常容易上手的GIt详细教程" }1
2
3
4
5
文档3:
POST blog/article/3 { "title":"java从入门到精通", "content":"《java从入门到精通》非常适合java初学" }1
2
3
4
5
三、REST高亮API
我们查询title中含有java的文档,并用自定义高亮片段标记出来。POST blog/_search { "query": { "match": { "title": "java" } }, "highlight": { "fields": { "title": { "pre_tags": "<strong>", "post_tags": "</strong>" } } } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
查询结果:
"total": 2, "max_score": 2.3014567, "hits": [ { "_index": "blog", "_type": "article", "_id": "3", "_score": 2.3014567, "_source": { "title": "java从入门到精通", "content": "《java从入门到精通》非常适合java初学" }, "highlight": { "title": [ "<strong>java</strong>从入门到精通" ] } }, { "_index": "blog", "_type": "article", "_id": "1", "_score": 2.025282, "_source": { "title": "java编程思想", "content": "《Java编程思想》这本书赢得了全球程序员的广泛赞誉" }, "highlight": { "title": [ "<strong>java</strong>编程思想" ] } } ] } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
四、搜索高亮的java api实现
jar包导入请参考前面的的一篇博客Elasticsearch 5.X下JAVA API使用指南 写一个测试类:
package esjavapia5; import java.net.InetAddress; import java.net.UnknownHostException; import org.elasticsearch.action.search.SearchResponse; 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.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.transport.client.PreBuiltTransportClient; public class Es5Highlight { public static void main(String[] args) throws UnknownHostException { // TODO Auto-generated method stub // 设置集群名称 Settings settings = Settings.builder() .put("cluster.name", "elasticsearch").build(); // 创建client TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress( InetAddress.getByName("127.0.0.1"), 9300)); QueryBuilder matchQuery = QueryBuilders.matchQuery("title", "编程"); HighlightBuilder hiBuilder=new HighlightBuilder(); hiBuilder.preTags("<h2>"); hiBuilder.postTags("</h2>"); hiBuilder.field("title"); // 搜索数据 SearchResponse response = client.prepareSearch("blog") .setQuery(matchQuery) .highlighter(hiBuilder) .execute().actionGet(); //获取查询结果集 SearchHits searchHits = response.getHits(); System.out.println("共搜到:"+searchHits.getTotalHits()+"条结果!"); //遍历结果 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()); } } } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
运行结果:
no modules loaded loaded plugin [org.elasticsearch.index.reindex.ReindexPlugin] loaded plugin [org.elasticsearch.percolator.PercolatorPlugin] loaded plugin [org.elasticsearch.script.mustache.MustachePlugin] loaded plugin [org.elasticsearch.transport.Netty3Plugin] loaded plugin [org.elasticsearch.transport.Netty4Plugin] 共搜到:1条结果! String方式打印文档搜索内容: { "title":"java编程思想", "content":"《Java编程思想》这本书赢得了全球程序员的广泛赞誉" } Map方式打印高亮内容 {title=[title], fragments[[java<h2>编程</h2>思想]]} 遍历高亮集合,打印高亮片段: java<em>编程</h2>思想1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
截图如下:
相关文章推荐
- Elasticsearch 5.1.1搜索高亮及Java API实现
- elasticsearch5.5.2用javaAPI实现搜索结果高亮显示和搜索建议
- 分布式搜索elasticsearch java API 之(八)------使用More like this实现基于内容的推荐
- 分布式搜索elasticsearch java API 之 highlighting (对搜索结果的高亮显示)
- 分布式搜索elasticsearch java API 之(八)------使用More like this实现基于内容的推荐
- 分布式搜索elasticsearch java API 之(八)------使用More like this实现基于内容的推荐
- 分布式搜索elasticsearch java API 使用More like this实现
- elasticsearch实现搜索拼音然后高亮内容
- ElasticSearch学习29_基于Elasticsearch实现搜索推荐
- 使用 Elasticsearch 实现博客站内搜索
- elasticsearch java API搜索多个index和type
- Elasticsearch java api 基本搜索部分详解
- Spring Data Elasticsearch加Elasticsearch服务实现全文搜索
- Elasticsearch java api 基本搜索部分详解
- asp实现关键词不区分大小写搜索并高亮显示
- js实现搜索字高亮
- 分布式搜索elasticsearch java API 之(四)------删除索引数据
- 分布式搜索elasticsearch java API 之(三)------索引数据
- ASP.NET使用正则表达式实现搜索关键字高亮显示
- elasticsearch JAVA客户端操作---搜索的过滤、分组高亮,elasticsearchjava