2017-09-05 63 views
0

我想根據用戶名列表找到用戶。用戶名列表可能包含部分用戶名,並且將來自Web應用程序。對於多個值的NEST部分匹配:通配符中的通配符還是其他方式?

var userNames = new List<string> (...); // not sure how many! 

LINQ:

var userEntity = allUsers.Where(p=> userNames.Any(x=> p.UserName.Contains(x))) 

NEST:???

must.Terms(t => t.Field(f => f.UserName).Terms<string>(usernames)) 

但這隻返回完全匹配而不是部分。

如何將上述LINQ查詢翻譯成NEST(ElasticSearch)?

回答

1

低效的辦法是建立一個與bool query with should clauses (if relevancy scores are needed) or a filter (if relevancy scores are not needed) clause查詢bool條款should,與prefixwildcardregexp查詢,一個是你正在尋找每一個唯一的用戶名的集合。根據您正在查看的數據量以及要搜索的用戶名數量,此查詢的性能可能是真的不好。

更爲有效的方法是根據您希望使用的標記進行搜索來將用戶名索引爲analyzer that tokenizes usernames,例如,如果你正在尋找通過搜索Ru以匹配用戶名Russ,那麼你會希望建立一個包括edgengram tokenizertoken filter,然後用match查詢分析器,或any query that undergoes analysis at query time.