我正在嘗試通過多個檔案欄位檢索其中包含短語的檔案,不一定在單詞的開頭。
比如“ell”應該匹配一個檔案欄位“hello”。并在兩個領域做到這一點。
MultiMatch 由于這個 SO answer,我最初選擇了。這是我的實作:
QueryContainer &= Query<VeganItemEstablishmentSearchDto>.MultiMatch(c => c
.Fields(f => f.Field(p => p.VeganItem.Name).Field(v => v.VeganItem.CompanyName))
.Query(query)
.MaxExpansions(2)
.Slop(2)
.Name("named_query")
);
但是我發現如果我的搜索短語以單詞開頭,它只會匹配“hello”,例如它不會匹配“ello”。
所以我后來改成QueryString由于這個 SO 答案。我的實作是:
QueryContainer &= Query<VeganItemEstablishmentSearchDto>.QueryString(c => c
.Fields(f => f.Field(p => p.VeganItem.Name).Field(v => v.VeganItem.CompanyName))
.Query(query)
.FuzzyMaxExpansions(2)
.Name("named_query")
);
但我發現情況更糟。它沒有搜索多個欄位,只有p.VeganItem.Name“hello”仍然不匹配“hello”。
如何使用 Nest 搜索可以位于單詞中間和多個檔案欄位中的術語?
uj5u.com熱心網友回復:
通配符查詢很昂貴,如果您想自定義并允許搜索多少個中間字符,您可以使用n-gram tokenizer來完成,這會更便宜,并且會為您提供更多的自定義/靈活性。
我還寫了一篇關于實作自動完成及其與性能和功能要求的各種權衡的博客文章。
uj5u.com熱心網友回復:
對于這種情況,您需要使用通配符查詢,有關通配符查詢檢查的更多資訊請點擊此處,對于嵌套 WildQueries,請點擊此處。
要在 Nest 中進行通配符查詢,您可以這樣做:
new QueryContainer[]
{
Query<VeganItemEstablishmentSearchDto>.Wildcard(w => w
.Field(v => v.VeganItem.CompanyName))
.Value(query)),
Query<VeganItemEstablishmentSearchDto>.Wildcard(w => w
.Field(p => p.VeganItem.Name))
.Value(query)
}
您應該在查詢的開頭和結尾添加星號 (*)。
請記住,通配符查詢很昂貴,您可能希望通過在映射中使用不同的分析器來實作這些。
uj5u.com熱心網友回復:
QueryString來自這個 SO 的答案對我來說適用于多個領域和一個單詞的中間。我還沒有嘗試過阿米特的答案。我會在未來。這是初學者的快速解決方案:
QueryContainer &= Query<VeganItemEstablishmentSearchDto>
.QueryString(c => c
.Name("named_query")
.Boost(1.1)
.Fields(f => f.Field(p => p.VeganItem.Name).Field(v => v.VeganItem.CompanyName))
.Query($"*{query}*")
.Rewrite(MultiTermQueryRewrite.TopTermsBoost(10))
);
這也有效:
QueryContainer = QueryContainer | Query<VeganItemEstablishmentSearchDto>
.MatchPhrase(c => c
.Boost(1.1)
.Field(f => f.VeganItem.Name)
.Query(query)
.Slop(1)
);
QueryContainer = QueryContainer | Query<VeganItemEstablishmentSearchDto>
.MatchPhrase(c => c
.Boost(1.1)
.Field(f => f.VeganItem.CompanyName)
.Query(query)
.Slop(1)
);
var terms = query.ToLower().Split(' ');
foreach (var term in terms)
{
QueryContainer = QueryContainer | Query<VeganItemEstablishmentSearchDto>
.Wildcard(c => c
.Value($"*{term}*")
.Field(f => f.VeganItem.CompanyName)
.Rewrite(MultiTermQueryRewrite.TopTermsBoost(10))
);
QueryContainer = QueryContainer | Query<VeganItemEstablishmentSearchDto>
.Wildcard(c => c
.Value($"*{term}*")
.Field(f => f.VeganItem.Name)
.Rewrite(MultiTermQueryRewrite.TopTermsBoost(10))
);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/471150.html
下一篇:從SpringBootRESTAPI中的JavaAPI客戶端回傳整個Elasticsearch回應(作為SearchResponse)
