【问题标题】:Storing token frequencies in elasticsearch, instead of storing text在弹性搜索中存储令牌频率,而不是存储文本
【发布时间】:2019-03-04 12:43:08
【问题描述】:

根据我阅读文档的理解,elasticsearch 的工作原理是计算词频 * 非多样化词频。它将文本转换为某种术语频率字典,其中还包括这些术语最常见的位置索引。

我想要做的不是存储文本,而是每行数据的词频。当我简单地上传全文时,搜索工作正常,但在具有 10 多万页文本的完整解决方案中效果不佳。如果文本内容不相关,只存储词频不是更有效吗?

编辑:数据的匿名性也很重要,因此我不希望将完整的句子和段落存储在外部。

【问题讨论】:

  • 有人吗?这对我的应用程序至关重要。

标签: python elasticsearch tokenize word-frequency


【解决方案1】:

出于您的目的,您可以在文本字段中为词频实现一个词向量。请阅读文档here。 然后,您可以对 termvector 使用批量查询,即 mtermvector-doc herepython api doc。它适用于 id 列表。例如,如果您有一个与“sky”匹配的文档的所有 id 的列表,则可以这样进行:

from elasticsearch import Elasticsearch

es = Elasticsearch()

index = "abc"
my_doc_type ="your_doc_type"
ids = []

result = es.search(index="abc", doc_type= my_doc_type body={"query": {"term": {"my_field":  "sky"}}})     

for res in in result['hits']['hits']:
    ids.append(res['ids'])




for doc in es.mtermvectors(index=index,doc_type=doc_type,body=dict(ids=ids,parameters=dict(term_statistics=True,field_statistics=True,fields=fields)))['docs']:                                                                                                                                                            
    fields = doc['term_vectors']  
    terms = field['terms']  
    tf = vec["term_freq"]
    df =  vec["doc_freq"]

【讨论】:

  • 我不太明白。我最终做的是禁用 _source (elastic.co/guide/en/elasticsearch/reference/current/…) 但是,我不完全确定这是否会“删除”数据?另外我不知道如何只禁用一列上的源,而不是全部。
  • 我不明白你为什么要禁用 _source ?这样你就不能调试你的查询。如果你想节省空间,你应该禁用规范并输入 "index_options": "freqs" 但请注意 ;-) 请在此处阅读:elastic.co/guide/en/elasticsearch/reference/current/…
  • 禁用源是否会从集群中删除数据?数据不能存储在云端,我也不需要看数据,只需要搜索它就可以找到与文本相关联的 URL。即我想根据其内容搜索学术论文,但我不需要检索文档的全文。
猜你喜欢
  • 2023-03-19
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多