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:
PUT blog
创建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编程思想》这本书赢得了全球程序员的广泛赞誉"}
文档2:
POST blog/article/2{ "title":"手把手教你使用Git", "content":"这是一个非常容易上手的GIt详细教程"}
文档3:
POST blog/article/3{ "title":"java从入门到精通", "content":"《java从入门到精通》非常适合java初学"}
三、REST高亮API
我们查询title中含有java的文档,并用自定义高亮片段标记出来。
POST blog/_search{ "query": { "match": { "title": "java" } }, "highlight": { "fields": { "title": { "pre_tags": "<strong>", "post_tags": "</strong>" } } }}
查询结果:
"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 esjavapia5import java.net.InetAddressimport java.net.UnknownHostExceptionimport org.elasticsearch.action.search.SearchResponseimport org.elasticsearch.client.transport.TransportClientimport org.elasticsearch.common.settings.Settingsimport org.elasticsearch.common.text.Textimport org.elasticsearch.common.transport.InetSocketTransportAddressimport org.elasticsearch.index.query.QueryBuilderimport org.elasticsearch.index.query.QueryBuildersimport org.elasticsearch.search.SearchHitimport org.elasticsearch.search.SearchHitsimport org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilderimport org.elasticsearch.transport.client.PreBuiltTransportClientpublic 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 loadedloaded 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
截图如下: