我很难按特定术语搜索文档。每次我做零结果。
这是一个代码示例:
var customers = new List<SampleCustomer>();
customers.Add(new SampleCustomer(){id=1,firstname="John", surname="Smith", country = "UK", sex = "Male", age=30});
customers.Add(new SampleCustomer(){id=2,firstname="Steve", surname="Jones", country ="UK", sex = "Male", age=22});
customers.Add(new SampleCustomer(){id=3,firstname="Kate", surname="Smith", country ="UK", sex = "Female", age=50});
customers.Add(new SampleCustomer(){id=4,firstname="Mark", surname="Jones", country ="USA", sex = "Male", age=45});
customers.Add(new SampleCustomer(){id=5,firstname="Emma", surname="Jonson", country ="USA", sex = "Female", age=25});
customers.Add(new SampleCustomer(){id=6,firstname="Tom", surname="Jones", country ="France", sex = "Male", age=30});
customers.Add(new SampleCustomer(){id=7,firstname="Liz", surname="Web", country ="France", sex = "Female", age=45});
foreach (var customer in customers)
{
_elasticClient.DeleteById("sample", "SampleCustomers",customer.id);
_elasticClient.Index(customer, "sample", "SampleCustomers" , customer.id);
}
使用该索引,我可以使用查询字符串过滤器查询姓氏为smith的客户
var queryByQueryString = _elasticClient.Search<SampleCustomer>(s =>
s.From(0).Size(10).Type("SampleCustomers")
.Query(q => q.QueryString(qs => qs.Query("Smith").OnField("surname"))));
但是,如果我尝试使用术语“文件管理器”搜索客户,则结果为零
var queryByTerm = _elasticClient.Search<SampleCustomer>(s =>
s.From(0).Size(10).Type("SampleCustomers")
.Query(q => q.Term(p => p.surname, "Smith")));
我不知道我在做什么错?在上面的示例中,我想确保我的查询仅返回姓氏完全等于“Smith”的结果,并且如果某人具有“Smith Jones”之类的双管姓氏,则它们不会出现在结果中。
最佳答案
在没有看到映射的情况下很难确定,但是您的问题可能只是区分大小写。如果"surname"
字段使用默认的 standard
analyzer(除非您在映射中指定一个,否则为默认),则标记将修改为小写。因此,将有一个"smith"
token ,但没有"Smith"
。当您使用查询字符串查询时,将对您的查询文本进行分析(除非您提供standard
分析器,否则将使用"smith"
分析器进行分析),因此搜索文本将被修改为与 token 匹配的term
。但是 "Smith"
filter不会做任何分析,并且过滤器文本"surname"
与任何标记都不匹配,因此不会返回任何结果。
如果这确实是您的问题,则应返回结果:
var queryByTerm = _elasticClient.Search<SampleCustomer>(s =>
s.From(0).Size(10).Type("SampleCustomers")
.Query(q => q.Term(p => p.surname, "smith")));
或者,您可以在映射中将
"index": "not_analyzed"
字段设置为"Smith"
(将需要重新索引),因此标记将不会小写,并且带有ojit_code文本的术语过滤器将匹配。关于elasticsearch - 使用NEST客户端通过术语查询进行 Elasticsearch ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21144162/