java 客户端 获取 termvectors
JiaShiwen 发表了文章 • 0 个评论 • 5038 次浏览 • 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远程调用查询数据速度很慢?本地部署查询正常?为什么?谢谢
yangchenq 回复了问题 • 2 人关注 • 2 个回复 • 3492 次浏览 • 2018-01-22 10:15
blocks.read_only_allow_delete的配置为什么自动变
rochy 回复了问题 • 2 人关注 • 2 个回复 • 7566 次浏览 • 2018-10-24 17:22
创建index会影响es的写入性能吗?
luohuanfeng 回复了问题 • 3 人关注 • 1 个回复 • 2946 次浏览 • 2018-01-19 16:19
全文检索 时 中文 有效,但是英文和数字不生效 这个怎么处理?
laoyang360 回复了问题 • 5 人关注 • 2 个回复 • 4452 次浏览 • 2018-01-19 19:18
比较复杂的多索引搜索,不知道怎么处理
mcs41531 回复了问题 • 2 人关注 • 1 个回复 • 2194 次浏览 • 2018-01-19 17:29
ES中能不能根据结果集各字段的不同值自动进行聚合,求助!!!
venyowang 回复了问题 • 2 人关注 • 1 个回复 • 2519 次浏览 • 2018-01-19 16:17
elasticsearch查询语句优化问题
laoyang360 回复了问题 • 4 人关注 • 1 个回复 • 2988 次浏览 • 2018-01-20 13:05
求助连接elasticsearch
xinfanwang 回复了问题 • 3 人关注 • 1 个回复 • 1422 次浏览 • 2018-01-18 11:37
es 字段中包含/-等特殊字符检索
zou100222 回复了问题 • 3 人关注 • 1 个回复 • 4794 次浏览 • 2019-05-23 13:22