2017-09-05 65 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.