【问题标题】:False result in Elastic Search Query below下面的弹性搜索查询中的错误结果
【发布时间】:2017-05-17 22:11:27
【问题描述】:

我是弹性搜索的新手,我第一次使用它来索引我的数据并对其执行搜索。

我编写了这段代码来查找索引中的术语计数:

{
  {
    "size": 0
  },
  "aggs": {
    "BookID": {
      "terms": {
        "field": "bookID",
        "size": 100000
      },
      "aggs": {
        "total_Chapter": {
          "nested": {
            "path": "chapterData"
          },
          "aggs": {
            "termsInChapter": {
              "filters": {
                "filters": {
                  "king": {
                    "query_string": {
                      "query": "king",
                      "default_field": "chapter.data"
                    }
                  },
                  "queen": {
                    "query_string": {
                      "query": "queen",
                      "default_field": "chapter.data"
                    }
                  },
                  "apple": {
                    "query_string": {
                      "query": "apple",
                      "default_field": "chapter.data"
                    }
                  }
                }
              }
            },
            "termsInChapter_count": {
              "value_count": {
                "field": "termsInChapter"
              }
            }
          }
        }
      }
    }
  }
}

但不知何故,结果返回 0。我不知道我在此查询中做错了什么。

这是该查询的部分输出:

"aggregations": {
    "BookID": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": 1,
          "doc_count": 1,
          "total_Chapter": {
            "doc_count": 23,
            "termsInChapter": {
              "buckets": {
                "apple": {
                  "doc_count": 2
                },
                "king": {
                  "doc_count": 1
                },
                "queen": {
                  "doc_count": 1
                }
              }
            },
            "termsInChapter_count": {
              "value": 0              <=========This should return 3
            }
          }
        },
        {
          "key": 2,
          "doc_count": 1,
          "total_Chapter": {
            "doc_count": 23,
            "termsInChapter": {
              "buckets": {
                "apple": {
                  "doc_count": 0
                },
                "king": {
                  "doc_count": 3
                },
                "queen": {
                  "doc_count": 2
                }
              }
            },
            "termsInChapter_count": {
              "value": 0
            }
          }
        },

提前感谢您的帮助。

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    您的 termsInChapter_count 聚合需要引用一个字段,而不是聚合名称,这就是您的解决方案不起作用的原因。

    为此,您需要 sum_bucket 类型的聚合:

    "termsInChapter_count": {
      "sum_bucket": {
        "buckets_path": "termsInChapter._count"
      }
    }
    

    稍后编辑

      "aggs": {
        "termsInChapter": {
          "filters": {
            "filters": {
              "king": {
                "query_string": {
                  "query": "king",
                  "default_field": "chapter.data"
                }
              },
              "queen": {
                "query_string": {
                  "query": "queen",
                  "default_field": "chapter.data"
                }
              },
              "apple": {
                "query_string": {
                  "query": "apple",
                  "default_field": "chapter.data"
                }
              }
            }
          },
          "aggs": {
            "filter_zero_matches_buckets": {
              "bucket_selector": {
                "buckets_path": {
                  "hits": "_count"
                },
                "script": "params.hits > 0"
              }
            }
          }
        },
        "termsInChapter_count": {
          "bucket_script": {
            "buckets_path": {
              "bucket_count": "termsInChapter._bucket_count"
            },
            "script": "params.bucket_count"
          }
        }
      }
    

    您在结果中寻找的是termsInChapter_count 值。

    【讨论】:

    • 这会返回所有桶的计数总和。我想要的是匹配的术语数而不是匹配的术语数的总和。
    • 我该怎么办?
    • 我没有关注。你想要桶的数量吗?
    • 我想要匹配的字词数量...假设我搜索了四个字词,但其中三个匹配了我想要结果中的“3”,现在如果我搜索五个字词和其中两个匹配我想要结果中的“2”。谢谢
    • 我现在明白了。我用应该做的事情更新了答案,但它更复杂。
    【解决方案2】:

    首先感谢Andrei Stefan 的帮助。

    我直接回答这个问题,这样任何人都可以得到直接的答案,而无需通过 cmets 等等。

    通过您的this 答案,我发现bucket_script 应该放在更高的级别。所以我稍微改变了你上一个答案的查询,它起作用了。

    这是最终的工作查询:

    "aggs": {
      "total_Chapter": {
        "nested": {
          "path": "chapterData"
        },
        "aggs": {
          "termsInChapter": {
            "filters": {
              "filters": {
                "king": {
                  "query_string": {
                    "query": "king",
                    "default_field": "chapter.data"
                  }
                },
                "queen": {
                  "query_string": {
                    "query": "queen",
                    "default_field": "chapter.data"
                  }
                },
                "apple": {
                  "query_string": {
                    "query": "apple",
                    "default_field": "chapter.data"
                  }
                }
              }
            },
            "aggs": {
              "filter_zero_matches_buckets": {
                "bucket_selector": {
                  "buckets_path": {
                    "hits": "_count"
                  },
                  "script": "params.hits > 0"
                }
              }
            }
          }
        }
      },
      "termsInChapter_count": {
        "bucket_script": {
          "buckets_path": {
            "bucket_count": "total_Chapter>termsInChapter._bucket_count"
          },
          "script": "params.bucket_count"
        }
      }
    }
    

    再次感谢Andrei。 :)

    【讨论】:

    • 是的,为了简化我的测试,我没有使用nested 数据结构进行测试。很高兴你最终成功了:-)。
    猜你喜欢
    • 2017-10-22
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2021-07-12
    • 2020-06-15
    相关资源
    最近更新 更多