Elasticsearch 关于嵌套对象的重要术语

Posted

技术标签:

【中文标题】Elasticsearch 关于嵌套对象的重要术语【英文标题】:Elasticsearch significant terms on nested objects 【发布时间】:2015-10-27 16:42:44 【问题描述】:

对于我的硕士论文,我使用 Elasticsearch 来衡量句子、段落和文档对索引其余部分的重要性。我使用了 3 个不同的索引来实现快速查询。一切正常,但我想评估是否可以对嵌套对象或父子关系做同样的事情。

在这里,我尝试使用嵌套对象设置和查询重要术语:

PUT /test_nested

    "settings":  
      "analysis": 
        "filter": 
          "german_stop": 
            "type":       "stop",
            "stopwords":  "_german_" 
          ,
          "german_keywords": 
            "type":       "keyword_marker",
            "keywords":   [""] 
          ,
          "german_stemmer": 
            "type":       "stemmer",
            "language":   "light_german"
                ,
                "shingle_bigram": 
                    "type":       "shingle",
                    "max_shingle_size": 2,
                    "min_shingle_size": 2,
                    "output_unigrams": false
                ,
                "shingle_trigram": 
                    "type":       "shingle",
                    "max_shingle_size": 3,
                    "min_shingle_size": 3,
                    "output_unigrams": false                    
                
        ,
        "analyzer": 
          "unigram": 
            "tokenizer":  "standard",
            "filter": [
              "lowercase",
              "german_stop",
              "german_keywords",
              "german_normalization",
              "german_stemmer"
            ]
          
        
      
    ,  
  "mappings": 
    "document": 
      "properties": 
        "tags" : 
          "type" : "string",
          "analyzer" : "unigram",
          "index" : "analyzed"
        ,
        "publishDate" : 
          "type" : "date" 
        ,
        "paragraphs": 
          "type": "nested",
          "properties": 
            "sentences" :
              "type" : "nested",
              "properties": 
                "textBody": 
                  "type": "string",
                  "analyzer" : "unigram",
                  "index" : "analyzed",
                  "term_vector" : "with_positions_offsets",
                "term_statistics" : true
                
              
            
          
        
      
    
  

和2个测试文件:

PUT /test_nested/document/1

  "tags" : "DerSpiegel, Frankfurt",
  "publishDate" : "2005-12-11",
  "paragraphs" : [
    
      "sentences" : [ 
        "textBody" : "Größter anzunehmender Einschlag",
        "textBody": "Es gibt ziemlich blöde Vorurteile über Fußball.",
        "textBody": "Eines lautet: Der Ball ist rund.",
        "textBody": "Freitagabend, Messehalle 1 in Leipzig, die Auslosung zur Fußballweltmeisterschaft: Der Ball ist gar nicht rund."
        ]
    
  ]


PUT /test_nested/document/2

  "tags" : "DerSpiegel, Frankfurt",
  "publishDate" : "2005-12-11",
  "paragraphs" : [
    
      "sentences" : [ 
        "textBody" : "Dafür aber kann man mit so einem Ball auch viel mehr anstellen als mit diesen runden, kleinen Dingern, die früher aus Leder waren und heute aus Polyurethan sind.",
        "textBody": "Zum Beispiel die gigantischste Fußball-WM-Auslosungsshow aller Zeiten zelebrieren.",
        "textBody": "Eine Show, die zum globalen Fußball passt.",
        "textBody": "Hauptsache riesig - wen interessiert schon rund?"
        ]
    ,
    
      "sentences" : [
        "textBody" : "Mit der Verteilung der 32 Teams auf ihre acht Gruppen bekamen die Deutschen damit erstmals auch einen Vorgeschmack auf das Gewicht und die Wucht der WM im nächsten Jahr." ,
        "textBody" : "Mag die Nachricht des Abends auch gewesen sein, dass Deutschland gegen Costa Rica, Polen und Ecuador spielt und dass im Achtelfinale die Engländer drohen, die Botschaft des Spektakels von Leipzig heißt, dass die WM mit einer Opulenz über das Land kommen wird, von der sich die Deutschen bisher noch gar keine rechte Vorstellung gemacht haben." ,
        "textBody" : "Die Stimme von 1974 gehörte Wolfhard Kuhlins, Sportchef des HR, und das Weltereignis war nach 45 Minuten ausgestrahlt, nicht nach 150." ,
        "textBody" : "Zwar kam auch schon Franz Beckenbauer zum Interview ins Studio, aber selbst der Kaiser war noch nicht, was er mal wurde: Zum schwarzen Anzug trug er weiße Socken." 
        ]
    
  ]

很遗憾,我没有得到以下查询的任何重要术语:

GET test_nested/document/_search?search_type=count

  "query" : 
    "match_all" :
  ,
  "aggs" :
      "sentences":
        "nested" :
          "path" : "paragraphs.sentences"
        
      ,
      "aggs" : 

            "significant_terms" :  
              "chi_square": , 
              "field" : "paragraphs.sentences.textBody"
            

      
  

【问题讨论】:

【参考方案1】:

基本上,您只是遇到了语法错误。这似乎可以满足您的要求:

POST test_nested/document/_search?search_type=count

   "query": 
      "match_all": 
   ,
   "aggs": 
      "sentences": 
         "nested": 
            "path": "paragraphs.sentences"
         ,
         "aggs": 
            "sentances_sig_terms": 
               "significant_terms": 
                  "chi_square": ,
                  "field": "paragraphs.sentences.textBody"
               
            
         
      
   

这是我用来测试它的一些代码:

http://sense.qbox.io/gist/e53122ea5887bf48a9bab570ad1c63546494026d

顺便说一句,这个问题写得很好。

【讨论】:

糟糕,刚刚注意到另一个答案。他们先到了这里。 :)【参考方案2】:

您的问题是嵌套对象中有嵌套对象。我不确定这是有意为之,还是您只给了我们一小部分数据以进行最少的测试。

我为什么要这么说?因为您的查询中只有一个 nested 类型聚合,所以应该单独处理这些聚合。另外 - 您的 significant_terms 聚合没有名称。总结一下:

    我已将您的 nested 聚合分成两部分 为significant_terms 聚合命名 利润??

这是您的疑问:

POST test_nested/document/_search?search_type=count

  "aggs": 
    "paragraphs": 
      "nested": 
        "path": "paragraphs"
      ,
      "aggs": 
        "sentences": 
          "nested": 
            "path": "paragraphs.sentences"
          ,
          "aggs": 
            "Significants": 
              "significant_terms": 
                "chi_square": ,
                "field": "paragraphs.sentences.textBody"
              
            
          
        
      
    
  

这是你的结果(我使用了你提供的测试数据):


   "took": 2,
   "timed_out": false,
   "_shards": 
      "total": 5,
      "successful": 5,
      "failed": 0
   ,
   "hits": 
      "total": 2,
      "max_score": 0,
      "hits": []
   ,
   "aggregations": 
      "paragraphs": 
         "doc_count": 3,
         "sentences": 
            "doc_count": 12,
            "Significants": 
               "doc_count": 12,
               "buckets": [
                  
                     "key": "rund",
                     "doc_count": 4,
                     "score": 2.1794871794871793,
                     "bg_count": 4
                  ,
                  
                     "key": "ball",
                     "doc_count": 3,
                     "score": 1.5178571428571428,
                     "bg_count": 3
                  ,
                  
                     "key": "wm",
                     "doc_count": 3,
                     "score": 1.5178571428571428,
                     "bg_count": 3
                  ,
                  
                     "key": "fussball",
                     "doc_count": 3,
                     "score": 1.5178571428571428,
                     "bg_count": 3
                  
               ]
            
         
      
   

如果这是您需要的,请告诉我。

【讨论】:

以上是关于Elasticsearch 关于嵌套对象的重要术语的主要内容,如果未能解决你的问题,请参考以下文章

elasticsearch 多词重要词聚合

Elasticsearch如何管理 Elasticsearch 文档中的嵌套对象

Elasticsearch:如何修改 nested 字段的值

Elasticsearch:如何修改 nested 字段的值

Elasticsearch 中的嵌套 vs 对象

嵌套vs Elasticsearch中的对象