ElasticSearch之termvector介绍

本文深入探讨Elasticsearch中的TermVector特性,包括term的基本信息、term及字段统计信息的作用与配置方法。此外,还介绍了两种收集term信息的方式:索引时(index-time)和查询时(query-time),并提供了具体的配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

termvector会获取document中的某个field内的各个term的统计信息。

一 term的基本信息

 term_freq:term在该字段中的频率

 position:词在该字段中的位置

 start_offset:从什么偏移量开始的

 end_offset: 到什么偏移量结束

二 term的统计信息

如果启用了term的统计信息,即term_statistics设为true,那么有哪些统计信息呢?

 doc_freq: 该词在文档中出现的频率

 ttf:total term frequency的缩写,一个term在所有document中出现的频率

三 字段的统计信息

如果启用了字段统计信息,即field_statistics设为true,那么有哪些统计信息呢?

 sum_doc_freq: 一个field中所有term的df之和

 doc_count: 有多少个文档包含这个字段

 sum_ttf:sum total term frequency的缩写, 一个field中的所有term的tf之和

term statistics和field statistics并不精准,不会被考虑有的doc可能被删除了

四 采集term信息的方式

采集term信息的方式有两种:index-time 和 query-time

4.1 index-time方式

需要在mapping配置一下,然后建立索引的时候,就直接生成这些词条和文档的统计信息

PUT /website

{
	"mappings": {
		"article": {
		   "properties": {
				"text": {
					"type": "text",
					"term_vector": "with_positions_offsets",
					"store": "true",
					"analyzer": "fulltext"
				}
			}
		}
	},
	"settings": {
		"analysis": {
			"analyzer": {
				"fulltext": {
					"type": "custom",
					"tokenizer": "whitespace",
					"filter": [
						"lowercase",
						"type_as_payload"
					]
				}
			}
		}
	}
}

term_vector(词向量):该属性的取值可以为no(默认值)、yes、with_offsets、with_positions、with_positions_offsets。该属性表示是否对该字段计算lucene词向量,如果使用的是高亮则需要计算词向量。

4.2 query-time方式

即之前没有在mapping里配置过,而是通过查询的方式产生这些统计信息


curl -XGET 'http://localhost:9200/twitter/tweet/1/_termvectors?fields=text'
或者
POST /ecommerce/music/1/_termvectors

{
  "fields":["desc"],
  "offsets":true,
  "payloads":true,
  "positions":true,
  "term_statistics":true,
  "field_statistics" : true
}

五 手动指定analyzer来生成termvector

我么可以通过指定per_field_analyzer设置一个分词器对该字段文本进行分词。

POST /ecommerce/music/1/_termvectors
{
    "fields":["desc"],
    "offsets":true,
    "payloads":true,
    "positions":true,
    "term_statistics":true,
    "field_statistics" : true,
    "per_field_analyzer":{
    "text":"standard"
}
}

六 过滤term的统计信息

我们可以根据term的统计信息,过滤出我么想看的统计结果,比如过滤掉一些出现频率过低的term,比如我要过滤出该字段最多只有10个term,而且那些term在该字段中出现的频率为2,且

POST /ecommerce/music/1/_termvectors

{
"fields":["desc"],
"offsets":true,
"payloads":true,
"positions":true,
"term_statistics":true,
"field_statistics" : true,
"filter":{
    "max_num_terms":10,
    "min_term_freq" : 2,
    "min_doc_freq" : 1
}
}

注意:默认这些统计信息是基于分片的,可以设置dfs为true,返回全部分片的信息,但是会有一定的性能问题,所以不推荐使用。还可以使用field字段对返回的统计信息的字段进行过滤,只返回感兴趣的那部分内容。

参考:https://www.cnblogs.com/xing901022/p/5348737.html

https://www.2cto.com/net/201711/698054.html



Term Vector是一个存储着文档中的术语及其位置、频率等信息的数据结构,主要用于全文搜索和文档聚类等操作。在Java中,我们可以使用Lucene或者Elasticsearch等开源搜索引擎库来实现Term Vector分词。具体实现方法如下: Lucene使用Term Vector分词 Lucene是一款Java开源搜索引擎库,它提供了丰富的API来实现Term Vector分词。我们可以使用IndexWriter类将文档索引化,并使用IndexSearcher类进行高效的全文搜索。在Lucene中,我们可以通过以下代码实现Term Vector分词: 1. 创建IndexWriterConfig对象 IndexWriterConfig config = new IndexWriterConfig(analyzer); 其中analyzer是指定的分词器,可以选择StandardAnalyzer、CJKAnalyzer等。 2. 设置Term Vector 在IndexWriterConfig中设置Term Vector: config.setTermVectors(true); config.setTermVectorPositions(true); config.setTermVectorOffsets(true); config.setTermVectorPayloads(true); 其中setTermVectors表示将Term Vector存储在文档中,setTermVectorPositions表示存储每个词项在文档中的位置,setTermVectorOffsets表示存储每个词项在文档中的偏移量,setTermVectorPayloads表示存储每个词项的负载信息。 3. 索引化文档 使用IndexWriter将文档索引化: IndexWriter writer = new IndexWriter(directory, config); writer.addDocument(doc); 其中directory是指定的索引目录,doc是待索引的文档。 4. 搜索 使用IndexSearcher进行全文搜索: IndexSearcher searcher = new IndexSearcher(reader); TermVectors termVectors = searcher.reader().getTermVectors(docID); TermVectorMapper mapper = new MyMapper(); termVectorsMapper.forEach(mapper); 其中docID是待搜索的文档ID,TermVectors是Term Vector对象,MyMapper是自定义的处理器。 Elasticsearch使用Term Vector分词 Elasticsearch是一种流行的分布式搜索和分析引擎,它基于Lucene库实现。在Elasticsearch中,我们可以使用Term Vector API实现Term Vector分词: 1. 创建Index 创建索引并指定分词器: PUT /my_index { "settings": { "analysis": { "analyzer": { "my_analyzer": { "type": "standard" } } } }, "mappings": { "properties": { "my_field": { "type": "text", "term_vector": "with_positions_offsets_payloads", "analyzer": "my_analyzer" } } } } 其中term_vector字段指定了需要存储的Term Vector属性类型,可以选择with_positions、with_offsets、with_payloads或者它们的组合。 2. 搜索 使用Term Vector API进行搜索: GET /my_index/_termvectors/1?fields=my_field&offsets=true&positions=true&payloads=true 其中1是文档ID,fields是要搜索的字段名,offsets、positions、payloads是需要的Term Vector属性类型。 总结 Term Vector分词是一种常用的全文搜索和文档聚类技术,它可以提高搜索效率、减少索引大小、提高查询精度等。在Java中,我们可以使用Lucene或者Elasticsearch等开源搜索引擎库来实现Term Vector分词。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值