Elasticsearch 嵌套对象的重要术语
Elasticsearch significant terms on nested objects
对于我的硕士论文,我使用 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"
}
}
}
}
您的问题是嵌套对象中有嵌套对象。我不确定这是有意为之,还是您只给了我们一小部分数据来进行最低限度的测试。
我为什么要这么说?因为您的查询中只有一个 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
}
]
}
}
}
}
}
让我知道这是否是您需要的。
基本上,您只是遇到了语法错误。这似乎可以满足您的要求:
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
顺便提一句,这个问题写得很好。
对于我的硕士论文,我使用 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"
}
}
}
}
您的问题是嵌套对象中有嵌套对象。我不确定这是有意为之,还是您只给了我们一小部分数据来进行最低限度的测试。
我为什么要这么说?因为您的查询中只有一个 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
}
]
}
}
}
}
}
让我知道这是否是您需要的。
基本上,您只是遇到了语法错误。这似乎可以满足您的要求:
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
顺便提一句,这个问题写得很好。