Elasticsearch对嵌套对象的重要术语

时间:2015-10-27 16:42:45

标签: elasticsearch significant-terms

对于我的修行,我使用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"
            }

      }
  }
}

2 个答案:

答案 0 :(得分:2)

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

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

  1. 我已将您的significant_terms汇总分成两个
  2. nested汇总一个名字
  3. 利润??
  4. 有你的疑问:

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

    请告诉我这是否是你需要的。

答案 1 :(得分:2)

基本上你只是语法错误。这似乎做你想要的:

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

顺便说一下,这是一个写得很好的问题。