簡體   English   中英

嵌套Elasticsearch中的空字段過濾器

[英]empty field filter in nest elasticsearch

我正在嘗試在NEST中創建查詢,如下所示:

得到* where CityName!=''和StreetName!=''

使用現有和缺少的過濾器無濟於事,因為這些字段不為空。 我也嘗試使用帶通配符(*)的queryString,但是我將所有文檔都返回到結果中。 我也嘗試過這樣的腳本過濾器:

qq.Filtered(ft => ft.Filter(f => f.Script(s => s.Script("doc['cityName'].value.length() > 0"))));

也行不通。 這些字段使用標准標記器以及ICU折疊進行索引。 有什么辦法嗎?

更新!!!!

我設法通過使用Regexp過濾器來做到這一點。 所以是這樣的:

 QueryContainer notNullQuery = null;

                notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.StdCityName).Value("[a-z0-9]+[\\s]?"))));
                notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.StdStreetCode).Value("[0-9]+"))));
                notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.StdStreetPostCode).Value("[a-z0-9]+[\\s]?"))));
                notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.LastName1).Value("[a-z0-9]+[\\s]?"))));
                notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.FirstName1).Value("[a-z0-9]+[\\s]?"))));
                notNullQuery &= qq.Filtered(ft => ft.Filter(f => f.Regexp(r => r.OnField(ff => ff.SourceDisplayPhone).Value("[0-9]+"))));

                return notNullQuery;

最新更新:對於NEST 5.x,將該字段作為關鍵字索引,然后對術語進行查詢搜索。 不要忘記放置Verbatim(),否則查詢將不會發送到服務器。

qq.Bool(b => b.MustNot(mn => mn.Term(t => t.Field(f => f.Email).Value("").Verbatim())));

默認情況下,NEST使用一種稱為無條件查詢的功能來重寫查詢,而無需編寫大量的if語句來構建查詢/過濾器。 看到http://nest.azurewebsites.net/nest/writing-queries.html

如果要關閉此功能,則可以在圖形調用中的任何點.Verbatim(bool verbatim = true)此標志會傳遞給子代,即使它們是無條件的,也會導致將它們寫入結果查詢/過濾器中。

類似地,當查詢是無條件的但絕對不允許時,設置.Strict(bool strict = true)將引發異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM