我是ElasticSearch的新手。现在,我有一个要求,需要返回所有包含关键字的结果。
public Class People(){
public string UserId {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
如果三个文件之一包含关键字,则类似于“%keyword%” ,我想过滤所有人员。
例如,我有一个人
var people = new People() {
UserId = "lastname.middlename.firstname",
FirstName = "firstname",
LastName = "lastname"
}
如何通过搜索关键字 ddl ,如何设置索引以及如何查询来获得此Peoplle。
我试图用下面的NEST查询
var keyword = "ddl"
var result = await _client.SearchAsync<People>(s =>
s.Query(q => q.MultiMatch(m => m.Fields(f => f.Field(ff => ff.UserId).Field(ff => ff.FirstName).Field(ff => ff.LastName)).Query(keyword)))
);
它不起作用。仅当我将关键字更改为 firstname 或 lastname 或 lastname.middlename.firstname
时,此方法才有效有什么办法可以满足要求?
答案 0 :(得分:0)
简短的答案是,您可能想为每个目标字段配置一个分析器,以将术语标记成三元组,可能使用min_gram
和max_gram
设置为3的ngram token filter 。此分析将为ddl
生成一个middlename
令牌,然后该令牌将与您的查询匹配。
更长的答案是,您需要阅读有关Analysis以及如何与.NET客户端进行write和test analyzers的内容。您可能要通过the example repository that builds a Nuget search application。这是一个相当复杂的演练,涉及许多概念,包括分析。
答案 1 :(得分:0)
要搜索部分字段,应在映射中使用ngram tokenizer。
它将使用不同大小的窗口标记您的字段。
这应该可以解决您的问题,但是您需要注意以下几点:
min_gram
参数)不要太小。在您的情况下,3可以使用。另一个易于实现但通常效率不高的解决方案是在查询字符串中使用wildcards queries。它与SQL中的 LIKE 运算符非常相似。