[英]How do I accurately represent this ElasticSearch query using NEST?
我在ElasticSearch中有一個查詢,我在幾個字段上使用過濾器(相對較小的數據集,我們確切地知道在查詢時這些字段中應包含哪些值)。 這個想法是,我們將執行全文查詢,但前提是我們已經過濾掉用戶做出的某些選擇。
我將ElasticSearch放在WebAPI控制器后面,並認為使用NEST完成查詢是有意義的。
我們有幾個領域的過濾器。 每個內部過濾器都是“或”過濾器,但它們在一起都是“與”號。
在SQL中,偽代碼等效項是select * from table where foo in (1,2,3) AND bar in (4,5,6)
。
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"or": [
{ "term": { "foo": "something" } },
{ "term": { "foo": "somethingElse" } }
]
},
{
"or": [
{ "term": { "bar": "something" } },
{ "term": { "bar": "somethingElse" } }
]
}
]
}
}
}
},
"size": 100
}
這種任務非常簡單,在ES中很流行。 您可以像下面這樣在NEST中表示它:
var rs = es.Search<dynamic>(s => s
.Index("your_index").Type("your_type")
.From(0).Size(100)
.Query(q => q
.Filtered(fq => fq
.Filter(ff => ff
.Bool(b => b
.Must(
m1 => m1.Terms("foo", new string[] { "something", "somethingElse" }),
m2 => m2.Terms("bar", new string[] { "something", "somethingElse" })
)
)
)
.Query(qq => qq
.MatchAll()
)
)
)
);
一些注意事項:
foo in ("something", "somethingElse") AND bar in ("something", "somethingElse")
,然后查詢所有過濾后的結果( match_all
)。 您可以將match_all
更改為所需的內容。 filtered query
是為了獲得最佳性能,因為ES僅需要評估query
部分中的文檔分數(過濾后),而不是所有文檔。 terms
過濾器,該過濾器比or
更加簡單和更好的性能。 terms
默認模式是“或”所有輸入術語,您可以在文檔中更多地了解可用模式(“與”,“或”,“普通”等)。 我認為Nest是.NET的最佳選擇,因為它是為簡單易用的目的而設計的。 僅當我想使用當時Nest不支持的新功能,或者Nest在使用的功能中存在錯誤時,才使用較低的API。 您可以在此處參考以獲取簡短的NEST教程: http : //nest.azurewebsites.net/nest/writing-queries.html
更新:動態構建布爾過濾器:
var filters = new List<Nest.FilterContainer>();
filters.Add(Nest.Filter<dynamic>.Terms("foo", new string[] { "something", "somethingElse" }));
// ... more filter
然后將.Bool(b => b.Must(...))
替換為.Bool(b => b.Must(...))
.Bool(b => b.Must(filters.ToArray()))
希望對你有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.