【问题标题】:Get top 100 most used three word phrases in all documents获取所有文档中前 100 个最常用的三个单词短语
【发布时间】:2017-01-15 18:26:09
【问题描述】:

我有大约 15,000 个抓取的网站,其正文存储在弹性搜索索引中。我需要获取所有这些文本中最常用的 100 个三词短语:

类似这样的:

Hello there sir: 203
Big bad pony: 92
First come first: 56
[...]

我是新手。我研究了术语向量,但它们似乎适用于单个文档。所以我觉得这将是术语向量和聚合与各种 n-gram 分析的组合。但我不知道如何实现这一点。任何指针都会有所帮助。

我当前的映射和设置:

{
  "mappings": {
    "items": {
      "properties": {
        "body": {
          "type": "string",
          "term_vector": "with_positions_offsets_payloads",
          "store" : true,
          "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"
          ]
        }
      }
    }
  }
}

【问题讨论】:

    标签: elasticsearch indexing lucene


    【解决方案1】:

    您正在寻找的是带状疱疹。带状疱疹就像“单词 n-gram”:字符串中多个术语的连续组合。 (例如“我们都生活”、“都生活在”、“生活在一个”、“在黄色”、“黄色潜艇”)

    看这里:https://www.elastic.co/blog/searching-with-shingles

    基本上,您需要一个带有仅生成 3 项带状疱疹的带状疱疹分析仪的字段:

    弹性博客文章配置,但具有:

    "filter_shingle":{
       "type":"shingle",
       "max_shingle_size":3,
       "min_shingle_size":3,
       "output_unigrams":"false"
    }
    

    在将 shingle 分析器应用于相关字段(如博客文章中所述)并重新索引您的数据后,您应该能够发出返回简单 terms aggregation 的查询,在您的 body 字段中查看排名前 100 的 3 词短语。

    {
      "size" : 0,
      "query" : {
        "match_all" : {}
      },
      "aggs" : {
        "three-word-phrases" : {
          "terms" : {
            "field" : "body",
            "size"  : 100  
          }
        }
      }
    }
    

    【讨论】:

    • 只有一个问题,如何在一个字段中处理多个短语大小。比如两字短语、四字短语等?我需要为每个分析器创建一个索引吗?
    • 有点。使用单独的分析器创建单独的字段,并将正文内容复制到所有字段。然后,您可以在每个专门建造的瓦片场上进行刻面。
    • 我让它在具有多个分析器、过滤器和多字段的单个索引上工作,如下所示:gist.github.com/HardlyMirage/448a5c8e915360f24c6bb04f5b51e785
    • 但是完成查询大约需要 6 分钟。所以需要考虑调整这个。
    • 索引可能需要一段时间(取决于您的集合的大小),但该查询应该会在一秒钟左右返回。拥有 15,000 个站点,我想您可以想象拥有非常庞大的(内容)站点,每个站点都有数十万个带状疱疹。如果查询本身确实很慢,请在更大的机器上尝试新的集群(优先考虑内存和本地 SSD 存储)。您可能只是交换了太少的可用物理内存。
    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    相关资源
    最近更新 更多