首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用频率计数的前缀搜索

使用频率计数的前缀搜索
EN

Stack Overflow用户
提问于 2018-11-01 05:35:54
回答 2查看 274关注 0票数 3

当我为文本建立索引时,我将每个单词的频率计数存储在数据库中。这很好用,因为所有的搜索都是基于整个单词的,并且所有可能的搜索都是已知的。但现在我想添加前缀搜索(搜索单词的一部分)的选项。我可以使用以下命令从elasticsearch的前缀搜索中获得结果/命中结果:

代码语言:javascript
复制
GET /my_index/address/_search
{
    "query": {
        "prefix": {
            "main_text": "word_part"
        }
    }
}

请参阅:https://www.elastic.co/guide/en/elasticsearch/guide/current/prefix-query.html

这是我当前的映射:

代码语言:javascript
复制
{
    "my-index":{
        "mappings":{
            "doc":{
                "properties":{
                    "keycounter":{
                        "properties":{
                            "counter": {"type":"integer"},
                            "keyword":{"type":"keyword"}
                         }
                    },
                    "main_text":{
                        "type":"text", 
                        "fielddata":true
                    },
                    "main_text_keycounter":{
                        "properties":{
                            "counter":{
                                "type":"long"
                            },
                            "keyword":{
                                "type":"text", 
                                "fields":{
                                    "keyword":{
                                        "type":"keyword",
                                        "ignore_above":256
                                    }
                                }
                            }
                        }
                    },
                    "time_written":{
                        "type":"date"
                    },
                    "translated_text":{
                        "type":"text",
                        "fielddata":true
                    },
                }
            }
        }
    }
}

但我不想计算我得到的每个结果的频率,因为它将为每个文本花费O(N)。有没有什么聪明的方法可以使用elasticsearch从这种类型的搜索中存储/获取频率计数?

EN

Stack Overflow用户

发布于 2018-11-13 16:12:58

您可以使用elasticsearch的doc-termvectors特性来获取术语统计信息和术语计数。与此类似,您可以使用映射存储文档,并在查询文档时获得前缀术语的统计信息。当然,这种方法为您提供了每个结果文档的术语统计信息,因此您必须聚合所有结果的术语统计信息。

下面是一个映射、索引文档和doc-termvectors查询的示例。您还可以使用edge-ngram标记器来获取前缀术语的统计信息。

映射

代码语言:javascript
复制
PUT /my-index
{
  "mappings": {
    "doc": {
      "properties": {
        "main_text": {
          "type": "text",
          "fielddata": true,
          "term_vector": "with_positions_offsets_payloads",
          "store": true
        }
      }
    }
  }
}

索引文档

代码语言:javascript
复制
POST /my-index/doc/1
{
  "main_text": "foo bar foo"
}

获取术语矢量

代码语言:javascript
复制
POST /my-index/doc/1/_termvectors

结果

代码语言:javascript
复制
...
"terms": {
    ...
    "foo": {
      "term_freq": 2,
      "tokens": [
        {
          "position": 0,
          "start_offset": 0,
          "end_offset": 3
        },
        {
          "position": 2,
          "start_offset": 8,
          "end_offset": 11
        }
      ]
    }
    ...

编辑

如果想要获得多个文档的termvectors,可以使用_mtermvectors端点。它将为您提供多个文档的统计信息。然而,它不会计算所有文档的词频,因为我理解你的问题是你想要的。作为一种解决方案,您可以将termvectors的结果存储在您的elastic中(相同的索引或单独的索引),然后使用聚合来计算总的词条计数。

代码语言:javascript
复制
POST /my-index/doc/_mtermvectors
{
  "ids": [
    "1",
    "2"
  ],
  "parameters": {
    "fields": [
      "main_text"
    ],
    "term_statistics": true
  }
}

编辑

然后,我认为解决方案是为所有文档调用termvectors并将结果存储在另一个索引中,即所有术语和子术语频率。通过根据你的搜索查询聚合结果,我们会得到你想要的结果。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53092276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档