NEST部分匹配多个值:通配符或其他任何方式?

时间:2017-09-05 22:53:06

标签: elasticsearch nest elasticsearch-5 elasticsearch-net

我想根据用户名列表查找用户。用户名列表可能包含部分用户名,并且将来自网络应用程序。

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 个答案:

答案 0 :(得分:1)

效率低下的方法是设置bool query with should clauses (if relevancy scores are needed) or a filter (if relevancy scores are not needed) clause boolshouldRuss个句子,其中包含prefixwildcard或{{3查询,一个用于您要查找的每个唯一用户名。根据您正在查看的数据量以及您要搜索的用户名数量,此查询的性能可能真的不好。

更有效的方法是根据您希望搜索的令牌使用regexp索引用户名,例如如果您希望通过搜索Ru来匹配用户名match,那么您需要构建包含analyzer that tokenizes usernamesedgengram tokenizer的分析器,然后使用{ {1}}查询,或token filter