12.term_vectors查看

1. Term Vectors 简介

Term Vectors(term向量)
返回特定文档field中的term的信息和统计信息。文档可以存储在索引中或由request提供。term向量请求的结果默认为实时的,不是近实时的。这可以通过将realtime参数设置为false来更改为非实时的。

GET /twitter/_termvectors/1

也可以使用url中的参数指定检索信息的field:

GET /twitter/_termvectors/1?fields=message

或通过在请求主体中添加请求的field(参见下面的示例)。也可以使用通配符指定field,类似于多匹配查询

注意

请注意/_termvector的使用方式在2.0中已废弃,请使用_termvectors替代。

1. 返回值

请求可以得到三种类型的值:term信息,term统计和field统计。默认情况下,所有term信息与field统计信息都会被返回,但不包含term统计信息。

term信息

  1. 在field中的词频(总是返回)
  2. term位置(positions: true)
  3. 开始与结束的offset(offsets: true)
  4. term payload信息(payloads: true),会使用base64编码

如果请求的信息没有存储在索引中,会尝试进行即时计算。另外,也可以基于请求方提供的doc计算term向量的信息。
也就是说mapping中不需要单独定义term_vector 的mapping param ,但是使用的时候有时候表现有些奇怪。
比如我使用

GET seats/_termvectors/8092

可能无法召回vector信息,但是增加fields字段参数,比如下面,就可以获取到vector信息了

GET seats/_termvectors/8092?fields=actors

注意

offset 的start和end 是跟军UTF-16编码来计算的。如果要使用这些offset来从原始文本中获取term,则应确保使用UTF-16对正在使用的子字符串进行编码。

term统计
设置term_statistics为true(默认为false)将返回:

  1. 总词频(所有文件中的term频率)tf
  2. 文档频率(包含term的文档数)df

默认情况下这些值不返回,因为term统计数据会严重影响性能。

field统计
将field_statistics设置为false(默认值为true)将省略:

  1. 文档数(包含此field的文档数)
  2. 文档频率的总和(本field中所有term的文档频率的总和)
  3. 词频的总和(该field中每个term的总词频的总和)

2. term过滤

可以根据term向量的tf-idf特性来对term向量进行过滤,这个有助于筛选比较有用的特诊向量。
可以使用以下参数

  1. max_num_terms: 每个field必须返回的最大term数。默认为25。
  2. min_term_freq: 在源文档中忽略少于此频率的单词。默认为1。
  3. max_term_freq: 在源文档中忽略超过此频率的单词。默认为无界。
  4. min_doc_freq: 忽略文档频率少于此参数的term。默认为1。
  5. max_doc_freq: 忽略文档频率大于此参数的term。默认为无界。
  6. min_word_length: 字词长度低于此参数的将被忽略。默认为0。
  7. max_word_length: 字词长度大于此参数的将被忽略。默认为无界(0)。

term和field统计信息不是精准的。删除的doc不会被统计。而且仅针对请求文档所在的分片检索信息。因此,term和field的统计信息只是作为相对的参考信息,准确的数字没有意义,。默认情况下,当请求的时候携带doc文档的时候,会随机选择一个碎片来获取统计数据。有routing的话仅使用路由来命中特定的分片。

示例:返回存储term向量
首先,我们创建一个存储term向量、有payload等的索引:

PUT /twitter
{ "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "term_vector": "with_positions_offsets_payloads",
        "store" : true,
        "analyzer" : "fulltext_analyzer"
       },
       "fullname": {
        "type": "text",
        "term_vector": "with_positions_offsets_payloads",
        "analyzer" : "fulltext_analyzer"
      }
    }
  },
  "settings" : {
    "index" : {
      "number_of_shards" : 1,
      "number_of_replicas" : 0
    },
    "analysis": {
      "analyzer": {
        "fulltext_analyzer": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "type_as_payload"
          ]
        }
      }
    }
  }
}

然后,我们添加一些文档:

PUT /twitter/_doc/1
{
  "fullname" : "John Doe",
  "text" : "twitter test test test "
}

PUT /twitter/_doc/2
{
  "fullname" : "Jane Doe",
  "text" : "Another twitter test ..."
}

以下请求返回文档1(John Doe)中fieldtext的所有信息和统计信息:

GET /twitter/_termvectors/1
{
  "fields" : ["text"],
  "offsets" : true,
  "payloads" : true,
  "positions" : true,
  "term_statistics" : true,
  "field_statistics" : true
}

返回

{
    "_id": "1",
    "_index": "twitter",
    "_type": "_doc",
    "_version": 1,
    "found": true,
    "took": 6,
    "term_vectors": {
        "text": {
            "field_statistics": {
                "doc_count": 2,
                "sum_doc_freq": 6,
                "sum_ttf": 8
            },
            "terms": {
                "test": {
                    "doc_freq": 2,
                    "term_freq": 3,
                    "tokens": [
                        {
                            "end_offset": 12,
                            "payload": "d29yZA==",
                            "position": 1,
                            "start_offset": 8
                        },
                        {
                            "end_offset": 17,
                            "payload": "d29yZA==",
                            "position": 2,
                            "start_offset": 13
                        },
                        {
                            "end_offset": 22,
                            "payload": "d29yZA==",
                            "position": 3,
                            "start_offset": 18
                        }
                    ],
                    "ttf": 4
                },
                "twitter": {
                    "doc_freq": 2,
                    "term_freq": 1,
                    "tokens": [
                        {
                            "end_offset": 7,
                            "payload": "d29yZA==",
                            "position": 0,
                            "start_offset": 0
                        }
                    ],
                    "ttf": 2
                }
            }
        }
    }
}

3. 示例:自动生成term向量

未明确存储在索引中的term向量将自动计算。以下请求返回文档1中field的所有信息和统计信息,即使term尚未明确存储在索引中。请注意,对于text这个field,因为设置mapping的时候指定了term_vector mapping param,所以这个字段的termvector不会重新生成。

GET /twitter/_termvectors/1
{
  "fields" : ["text", "some_field_without_term_vectors"],
  "offsets" : true,
  "positions" : true,
  "term_statistics" : true,
  "field_statistics" : true
}

some_field_without_term_vectors 代表了没有term_vectors属性的字段

4. 示例:request 中传入doc

还可以为request中的doc生成term向量,也就是生成索引中不存在的文档。例如,以下请求将返回与示例1中相同的结果。所使用的映射由索引和类型确定。

如果动态映射打开(默认),则不在原始映射中的文档field将被动态创建。

GET /twitter/_termvectors
{
  "doc" : {
    "fullname" : "John Doe",
    "text" : "twitter test test test"
  }
}

5. Per-field 分析器

另外,可以通过使用per_field_analyzer参数来提供不同于当前的分析器。这对于以任何方式生成term向量是有用的,特别是在使用request中的doc时。当为已经存储的term向量提供分析器时,将重新生成项向量。

GET /twitter/_termvectors
{
  "doc" : {
    "fullname" : "John Doe",
    "text" : "twitter test test test"
  },
  "fields": ["fullname"],
  "per_field_analyzer" : {
    "fullname": "keyword"
  }
}

响应:

{
  "_index": "twitter",
  "_type": "_doc",
  "_version": 0,
  "found": true,
  "took": 6,
  "term_vectors": {
    "fullname": {
       "field_statistics": {
          "sum_doc_freq": 2,
          "doc_count": 4,
          "sum_ttf": 4
       },
       "terms": {
          "John Doe": {
             "term_freq": 1,
             "tokens": [
                {
                   "position": 0,
                   "start_offset": 0,
                   "end_offset": 8
                }
             ]
          }
       }
    }
  }
}

6. 示例:term过滤

最后,返回的term可以根据他们的tf-idf分数进行过滤。在下面的例子中,我们从具有给定“plot”field值的request中的doc中获取三个“interesting”的关键字。请注意,关键字“Tony”或任何停止词不是响应的一部分,因为它们的tf-idf必须太低。

GET /imdb/_termvectors
{
    "doc": {
      "plot": "When wealthy industrialist Tony Stark is forced to build an armored suit after a life-threatening incident, he ultimately decides to use its technology to fight against evil."
    },
    "term_statistics" : true,
    "field_statistics" : true,
    "positions": false,
    "offsets": false,
    "filter" : {
      "max_num_terms" : 3,
      "min_term_freq" : 1,
      "min_doc_freq" : 1
    }
}

响应:

{
   "_index": "imdb",
   "_type": "_doc",
   "_version": 0,
   "found": true,
   "term_vectors": {
      "plot": {
         "field_statistics": {
            "sum_doc_freq": 3384269,
            "doc_count": 176214,
            "sum_ttf": 3753460
         },
         "terms": {
            "armored": {
               "doc_freq": 27,
               "ttf": 27,
               "term_freq": 1,
               "score": 9.74725
            },
            "industrialist": {
               "doc_freq": 88,
               "ttf": 88,
               "term_freq": 1,
               "score": 8.590818
            },
            "stark": {
               "doc_freq": 44,
               "ttf": 47,
               "term_freq": 1,
               "score": 9.272792
            }
         }
      }
   }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值