gpt4 book ai didi

elasticsearch - Elasticsearch:给定文档集中的总术语频率和文档计数

转载 作者:行者123 更新时间:2023-12-02 23:21:52 26 4
gpt4 key购买 nike

我正在尝试从给定的文档集中获得总术语频率和文档计数,但是elasticsearch中的_termvectors从索引内的所有文档返回ttf和doc_count。有什么办法可以指定文档列表(文档ID),以便结果仅基于那些文档。

以下是文档详细信息和查询,以获取总学期频率:

索引详细信息:

PUT /twitter
{ "mappings": {
"tweets": {
"properties": {
"name": {
"type": "text",
"analyzer":"english"
}
}
}
},
"settings" : {
"index" : {
"number_of_shards" : 1,
"number_of_replicas" : 0
}
}
}

文档详细信息:
PUT /twitter/tweets/1
{
"name":"Hello bar"
}

PUT /twitter/tweets/2
{
"name":"Hello foo"
}

PUT /twitter/tweets/3
{
"name":"Hello foo bar"
}

它将创建三个ID为1、2和3的文档。现在假设ID为1和2的推文属于user1,3属于另一个用户,我想获取user1的termvector。

查询以获得以下结果:
GET /twitter/tweets/_mtermvectors
{
"ids" : ["1", "2"],
"parameters": {
"fields": ["name"],
"term_statistics": true,
"offsets":false,
"payloads":false,
"positions":false
}
}

响应:
    {
"docs": [
{
"_index": "twitter",
"_type": "tweets",
"_id": "1",
"_version": 1,
"found": true,
"took": 1,
"term_vectors": {
"name": {
"field_statistics": {
"sum_doc_freq": 7,
"doc_count": 3,
"sum_ttf": 7
},
"terms": {
"bar": {
"doc_freq": 2,
"ttf": 2,
"term_freq": 1
},
"hello": {
"doc_freq": 3,
"ttf": 3,
"term_freq": 1
}
}
}
}
},
{
"_index": "twitter",
"_type": "tweets",
"_id": "2",
"_version": 1,
"found": true,
"took": 1,
"term_vectors": {
"name": {
"field_statistics": {
"sum_doc_freq": 7,
"doc_count": 3,
"sum_ttf": 7
},
"terms": {
"foo": {
"doc_freq": 2,
"ttf": 2,
"term_freq": 1
},
"hello": {
"doc_freq": 3,
"ttf": 3,
"term_freq": 1
}
}
}
}
}
]
}

在这里,我们可以看到 hello具有doc_count 3和ttf3。如何使其仅考虑具有给定id的文档。

我正在考虑的一种方法是为不同的用户创建不同的索引。但是我不确定这种方法是否正确。通过这种方法,索引将随着用户的增加而增加。还是有其他解决方案?

最佳答案

要获得文档子集中的术语文档数,您可以尝试使用简单的汇总。

您将必须在字段的映射中启用fielddata(尽管可能会占用更多内存,请查看documentation page about fielddata 以获得更多详细信息):

PUT /twitter
{
"mappings": {
"tweets": {
"properties": {
"name": {
"type": "text",
"analyzer":"english",
"fielddata": true,
"term_vector": "yes"
}
}
}
}
}

然后使用 terms 聚合:
POST /twitter/tweets/_search
{
"size": 0,
"query": {
"terms": {
"_id": [
"1",
"2"
]
}
},
"aggs": {
"my_term_doc_count": {
"terms": {
"field": "name"
}
}
}
}

响应将是:
{
"hits": ...,
"aggregations": {
"my_term_doc_count": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "hello",
"doc_count": 2
},
{
"key": "bar",
"doc_count": 1
},
{
"key": "foo",
"doc_count": 1
}
]
}
}
}

但是,我找不到在文档子集上计算 total_term_frequency的方法,恐怕无法完成。

我建议使用 _analyze API离线计算术语 vector ,并将其明确存储在单独的索引中。这样,您将能够使用简单的聚合来计算总的词频。在这里,我展示了 _analyze API的用法示例。
POST twitter/_analyze
{
"text": "Hello foo bar"
}

{
"tokens": [
{
"token": "hello",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "foo",
"start_offset": 6,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "bar",
"start_offset": 10,
"end_offset": 13,
"type": "<ALPHANUM>",
"position": 2
}
]
}

希望有帮助!

关于elasticsearch - Elasticsearch:给定文档集中的总术语频率和文档计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48201874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com