簡體   English   中英

過濾Elasticsearch結果-Nest

[英]Filtering Elasticsearch Results - Nest

我當前要從名為entity的類中編寫一個與“名稱”匹配的查詢,然后過濾出將GUID字段(在ES中存儲為字符串)與字符串GUID列表進行比較的結果。 如果存儲在Elasticsearch記錄中的guid與guid列表中的任何匹配,則返回這些結果。

我為此編寫的代碼是:

        ISearchResponse<Entity> oResponse = null;

        oResponse = _client.Search<Entity>(s => s
       .Size(oReq.returnValue)
       .Query(qr => qr
            .Bool(b => b
                 .Filter(flt => flt.Terms(tms => tms.Field(fd => fd.extentUid).Terms<string>(oReq.extentUids.ToList())))
                 .Should(sh => sh
                      .Match(mt => mt.Field(fl => fl.name.ToLower()).Query(oReq.name.ToLower())))))
            .Sort(srt => srt.Descending(SortSpecialField.Score)));

當我確定很多Elasticsearch記錄的GUID與列表中的一個相匹配時,以下代碼將返回0結果。 有人可以幫忙嗎?

注意:在代碼中,我首先過濾了記錄,但是我嘗試將其放在.Should()之后,並嘗試使用.PostFilter()。

提前致謝,

加里

我會檢查您的映射,並確保未分析您的Guid字段。 如彈性搜索的“ 查找精確值”所示 ,如果對該字段進行了分析,則每個以-分隔的組將被視為一個不同的標記。 字詞查詢

篩選具有與任何提供的術語(未分析)匹配的字段的文檔。

這意味着它將不會分析您提供的字符串,也不會在指定字段上查詢那些未分析的字符串。 如果您的字段被分析,您將不會獲得任何匹配。

作為一個側面說明,除非是在映射指定的,你的name領域可能由默認的分析。 您不必在匹配查詢中使用.ToLower() ,因為匹配查詢將在查詢的字符串上使用默認的搜索分析器。

我發現,當從elasticsearch檢索scopeUid字段時,它將字符串顯示為大寫。 即使使用代碼-tms.Field(fd => fd.extentUid.ToLower()),該字符串仍然保持大寫。

解決方案=如果未分析elasticsearch字符串,請確保要傳遞以與Elasticsearch字符串字段進行比較的字符串為大寫。

暫無
暫無

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

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