[英]ElasticSearch RANGE query doesn't work as expected
我正在嘗試使用 ES 7.7 Java API 對嵌套文檔運行 RANGE 查詢。我注意到它沒有按預期過濾數據。 當我將調試語句放在 ES 運行的實際查詢上時,我無法主要針對范圍查詢的“to”部分獲得適當的結果。 我注意到 GT 或 GTE 在 LT 上工作正常,而 LTE 也沒有按預期工作。
下面是這個范圍查詢的簡單 Java 代碼。 請注意,嵌套文檔中的權重被定義為浮點數,如""weight": {"type": "float"},"
。
query.must(QueryBuilders.nestedQuery(fields[0], QueryBuilders.rangeQuery(c.getField()).from(c.getValues().get(0)).to(c.getValues().get(1)),ScoreMode.None).innerHit(innerHitBuilder));
以下是 LT 的 Java API 代碼示例。
query.must(QueryBuilders.nestedQuery(fields[0], QueryBuilders.rangeQuery(c.getField()).lt(c.getValue()), ScoreMode.None).innerHit(innerHitBuilder));
下面是ES對上面語句RANGE查詢語句實際運行的查詢。
{
"from":0,
"size":50,
"query":{
"bool":{
"must":[
{
"match_phrase":{
"fundsponsor":{
"query":"vanguard group inc",
"slop":0,
"zero_terms_query":"NONE",
"boost":1.0
}
}
},
{
"nested":{
"query":{
"match_phrase":{
"holdings.componentticker":{
"query":"baba",
"slop":0,
"zero_terms_query":"NONE",
"boost":1.0
}
}
},
"path":"holdings",
"ignore_unmapped":false,
"score_mode":"none",
"boost":1.0,
"inner_hits":{
"name":"holdings.componenttickerbaba",
"ignore_unmapped":false,
"from":0,
"size":100,
"version":false,
"seq_no_primary_term":false,
"explain":false,
"track_scores":false
}
}
},
{
"nested":{
"query":{
"range":{
"holdings.weight":{
"from":1.0,
"to":2.0,
"include_lower":true,
"include_upper":true,
"boost":1.0
}
}
},
"path":"holdings",
"ignore_unmapped":false,
"score_mode":"none",
"boost":1.0,
"inner_hits":{
"name":"holdings.weightnull",
"ignore_unmapped":false,
"from":0,
"size":100,
"version":false,
"seq_no_primary_term":false,
"explain":false,
"track_scores":false
}
}
}
],
"adjust_pure_negative":true,
"boost":1.0
}
},
"_source":{
"includes":[
"fundsymbol",
"fundsponsor",
"fundname",
"componentcount",
"holdings.componentticker",
"holdings.weight"
],
"excludes":[
]
}
}
請注意下面的部分,這是這里的罪魁禍首。 其他一切都按預期工作。 正如我上面提到的,“from”按預期工作,並按預期轉換為 GTE,但“to”不起作用,出於某種奇怪的原因,“LT”或“LTE”也不起作用。
"nested":{
"query":{
"range":{
"holdings.weight":{
"from":1.0,
"to":2.0,
"include_lower":true,
"include_upper":true,
"boost":1.0
}
}
},
首先, from
和to
不是范圍查詢屬性。 范圍查詢需要lte
、 le
、 gte
和ge
。 查詢應如下所示:
{
"query": {
"nested": {
"path": "holdings",
"query": {
"range": {
"holdings.weight": {
"gte": 1,
"lte": 2
}
}
}
}
}
}
其次,檢查您的索引映射並確保holdings被映射為nested
並且weight被映射為float
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.