1

对于我的硕士论文,我使用 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"
            }

      }
  }
}
4

2 回答 2

3

基本上,您只是遇到了语法错误。这似乎做你想做的事:

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

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

于 2015-10-27T20:17:51.250 回答
2

您的问题是您在嵌套对象中有一个嵌套对象。我不确定这是否是有意的,或者您只给了我们一小部分数据来进行最少的测试。

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

  1. 我已将您的nested聚合分为两部分
  2. significant_terms聚合起一个名字
  3. 利润??

有你的查询:

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
                  }
               ]
            }
         }
      }
   }
}

让我知道这是否是您需要的。

于 2015-10-27T20:15:18.100 回答