java 客户端 获取 termvectors
Elasticsearch • JiaShiwen 发表了文章 • 0 个评论 • 4259 次浏览 • 2018-01-19 15:56
elasticsearch的termvectors包括了term的位置、词频等信息。这些信息用于相应的数据统计或开发其他功能,本文介绍termvecters如何使用,如何通过java客户端获取termvectors相关信息。
要使用termvctor首先要配置mapping中field的"term_vector"属性,默认状态es不开启termvector,因为这样会增加索引的体积,毕竟多存了不少元数据。
<br /> PUT test<br /> {<br /> "mappings": {<br /> "qa_test": {<br /> "dynamic": "strict",<br /> "_all": {<br /> "enabled": false<br /> },<br /> "properties": {<br /> "question": {<br /> "properties": {<br /> "cate": {<br /> "type": "keyword"<br /> },<br /> "desc": {<br /> "type": "text",<br /> "store": true,<br /> "term_vector": "with_positions_offsets_payloads",<br /> "analyzer": "ik_smart"<br /> },<br /> "time": {<br /> "type": "date",<br /> "store": true,<br /> "format": "strict_date_optional_time||epoch_millis||yyyy-MM-dd HH:mm:ss"<br /> },<br /> "title": {<br /> "type": "text",<br /> "store": true,<br /> "term_vector": "with_positions_offsets_payloads",<br /> "analyzer": "ik_smart"<br /> }<br /> }<br /> },<br /> "updatetime": {<br /> "type": "date",<br /> "store": true,<br /> "format": "strict_date_optional_time||epoch_millis||yyyy-MM-dd HH:mm:ss"<br /> }<br /> }<br /> }<br /> },<br /> "settings": {<br /> "index": {<br /> "number_of_shards": "1",<br /> "requests": {<br /> "cache": {<br /> "enable": "true"<br /> }<br /> },<br /> "number_of_replicas": "1"<br /> }<br /> }<br /> }<br />
注意示例中的"title"的"term_vector"属性。
接下来为索引创建一条数据
<br /> PUT qa_test_02/qa_test/1<br /> {<br /> "question": {<br /> "cate": [<br /> "装修流程",<br /> "其它"<br /> ],<br /> "desc": "筒灯,大洋和索正这两个牌子,哪个好?希望内行的朋友告知一下,谢谢!",<br /> "time": "2016-07-02 19:59:00",<br /> "title": "筒灯大洋和索正这两个牌子哪个好"<br /> },<br /> "updatetime": 1467503940000<br /> }<br />
下面我们看看这条数据上question.title字段的termvector信息
<br /> GET qa_test_02/qa_test/1/_termvectors<br /> {<br /> "fields": [<br /> "question.title"<br /> ],<br /> "offsets": true,<br /> "payloads": true,<br /> "positions": true,<br /> "term_statistics": true,<br /> "field_statistics": true<br /> }<br />
结果大概这个样子
<br /> {<br /> "_index": "qa_test_02",<br /> "_type": "qa_test",<br /> "_id": "1",<br /> "_version": 1,<br /> "found": true,<br /> "took": 0,<br /> "term_vectors": {<br /> "question.title": {<br /> "field_statistics": {<br /> "sum_doc_freq": 9,<br /> "doc_count": 1,<br /> "sum_ttf": 9<br /> },<br /> "terms": {<br /> "和": {<br /> "doc_freq": 1,<br /> "ttf": 1,<br /> "term_freq": 1,<br /> "tokens": [<br /> {<br /> "position": 2,<br /> "start_offset": 4,<br /> "end_offset": 5<br /> }<br /> ]<br /> },<br /> "哪个": {<br /> "doc_freq": 1,<br /> "ttf": 1,<br /> "term_freq": 1,<br /> "tokens": [<br /> {<br /> "position": 7,<br /> "start_offset": 12,<br /> "end_offset": 14<br /> }<br /> ]<br /> },<br /> "大洋": {<br /> "doc_freq": 1,<br /> "ttf": 1,<br /> "term_freq": 1,<br /> "tokens": [<br /> {<br /> "position": 1,<br /> "start_offset": 2,<br /> "end_offset": 4<br /> }<br /> ]<br /> },<br /> "好": {<br /> "doc_freq": 1,<br /> "ttf": 1,<br /> "term_freq": 1,<br /> "tokens": [<br /> {<br /> "position": 8,<br /> "start_offset": 14,<br /> "end_offset": 15<br /> }<br /> ]<br /> },<br /> "正": {<br /> "doc_freq": 1,<br /> "ttf": 1,<br /> "term_freq": 1,<br /> "tokens": [<br /> {<br /> "position": 4,<br /> "start_offset": 6,<br /> "end_offset": 7<br /> }<br /> ]<br /> },<br /> "牌子": {<br /> "doc_freq": 1,<br /> "ttf": 1,<br /> "term_freq": 1,<br /> "tokens": [<br /> {<br /> "position": 6,<br /> "start_offset": 10,<br /> "end_offset": 12<br /> }<br /> ]<br /> },<br /> "筒灯": {<br /> "doc_freq": 1,<br /> "ttf": 1,<br /> "term_freq": 1,<br /> "tokens": [<br /> {<br /> "position": 0,<br /> "start_offset": 0,<br /> "end_offset": 2<br /> }<br /> ]<br /> },<br /> "索": {<br /> "doc_freq": 1,<br /> "ttf": 1,<br /> "term_freq": 1,<br /> "tokens": [<br /> {<br /> "position": 3,<br /> "start_offset": 5,<br /> "end_offset": 6<br /> }<br /> ]<br /> },<br /> "这两个": {<br /> "doc_freq": 1,<br /> "ttf": 1,<br /> "term_freq": 1,<br /> "tokens": [<br /> {<br /> "position": 5,<br /> "start_offset": 7,<br /> "end_offset": 10<br /> }<br /> ]<br /> }<br /> }<br /> }<br /> }<br /> }<br />
下面我们说说如何通过java代码实现termvector的获取,不说废话直接上代码
<br /> TermVectorsResponse termVectorResponse = client.prepareTermVectors().setIndex(sourceindexname).setType(sourceindextype)<br /> .setId(id).setSelectedFields(fieldname).setTermStatistics(true).execute()<br /> .actionGet();<br /> XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON);<br /> termVectorResponse.toXContent(builder, null);<br /> System.out.println(builder.string());<br /> Fields fields = termVectorResponse.getFields();<br /> Iterator<String> iterator = fields.iterator();<br /> while (iterator.hasNext()) {<br /> String field = iterator.next();<br /> Terms terms = fields.terms(field);<br /> TermsEnum termsEnum = terms.iterator();<br /> while (termsEnum.next() != null) {<br /> BytesRef term = termsEnum.term();<br /> if (term != null) {<br /> System.out.println(term.utf8ToString() + termsEnum.totalTermFreq());<br /> }<br /> }<br /> }<br /> <br />
获取TermVectorsResponse的代码很好理解,主要是设置索引名称、索引type、索引id以及需要展示的若干属性。
接下来是如何获取某一term的termvector,有两种方案第一种是通过TermVectorsResponse的toXContent方法直接生成XContentBuilder,这种方法可以直接获取和上面通过DSL查询一样的json结果;第二种是通过Fields的iterator遍历fields,获取TermsEnum,熟悉lucene的同学应会更熟悉第二种方法。
使用ES Http远程调用查询数据速度很慢?本地部署查询正常?为什么?谢谢
Elasticsearch • yangchenq 回复了问题 • 2 人关注 • 2 个回复 • 3119 次浏览 • 2018-01-22 10:15
blocks.read_only_allow_delete的配置为什么自动变
Elasticsearch • rochy 回复了问题 • 2 人关注 • 2 个回复 • 7214 次浏览 • 2018-10-24 17:22
创建index会影响es的写入性能吗?
Elasticsearch • luohuanfeng 回复了问题 • 3 人关注 • 1 个回复 • 2639 次浏览 • 2018-01-19 16:19
全文检索 时 中文 有效,但是英文和数字不生效 这个怎么处理?
Elasticsearch • laoyang360 回复了问题 • 5 人关注 • 2 个回复 • 4070 次浏览 • 2018-01-19 19:18
比较复杂的多索引搜索,不知道怎么处理
Elasticsearch • mcs41531 回复了问题 • 2 人关注 • 1 个回复 • 1824 次浏览 • 2018-01-19 17:29
logstash配置log4j启动报错
Logstash • Mr. Zhang 回复了问题 • 3 人关注 • 3 个回复 • 7230 次浏览 • 2018-06-13 09:34
ES中能不能根据结果集各字段的不同值自动进行聚合,求助!!!
Elasticsearch • venyowang 回复了问题 • 2 人关注 • 1 个回复 • 2250 次浏览 • 2018-01-19 16:17
社区日报 第163期 (2018-01-19)
社区日报 • laoyang360 发表了文章 • 0 个评论 • 1423 次浏览 • 2018-01-19 06:44
http://t.cn/RQoQv2k
2、年后跳一跳|ES面试基础知识要点
http://t.cn/RQoHTLU
3、ES实践总结
http://t.cn/RHHczic
编辑:铭毅天下
归档:https://elasticsearch.cn/article/460
订阅:https://tinyletter.com/elastic-daily
问下各位logstash如何全量同步mysql数据,每天晚上12点更新,每次更新前将之前的数据删掉
Logstash • smiling 回复了问题 • 4 人关注 • 4 个回复 • 6472 次浏览 • 2018-01-22 17:12
elasticsearch查询语句优化问题
Elasticsearch • laoyang360 回复了问题 • 4 人关注 • 1 个回复 • 2684 次浏览 • 2018-01-20 13:05
求助连接elasticsearch
Elasticsearch • xinfanwang 回复了问题 • 3 人关注 • 1 个回复 • 1241 次浏览 • 2018-01-18 11:37
ES rest 查询 timeout的问题
回复Elasticsearch • ggsimida 发起了问题 • 1 人关注 • 0 个回复 • 6028 次浏览 • 2018-01-18 10:51