gpt4 book ai didi

elasticsearch - 使用 NEST 客户端通过 Term 查询进行搜索以进行 Elasticsearch

转载 作者:行者123 更新时间:2023-12-02 22:43:56 26 4
gpt4 key购买 nike

我很难按特定术语搜索文档。每次我都得到零结果。

这是一个代码示例:

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"))));

但如果我尝试使用术语 filer 搜索客户,我会得到零结果

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 filter不做任何分析,过滤文本 "Smith"不匹配任何标记,因此不返回任何结果。

如果这确实是您的问题,那么这应该返回结果:

var queryByTerm = _elasticClient.Search<SampleCustomer>(s =>
s.From(0).Size(10).Type("SampleCustomers")
.Query(q => q.Term(p => p.surname, "smith")));

或者,您可以设置 "surname"字段到 "index": "not_analyzed"在您的映射中(需要重新索引),因此标记不会是小写的,并且您的术语过滤器带有文本 "Smith"会匹配。

关于elasticsearch - 使用 NEST 客户端通过 Term 查询进行搜索以进行 Elasticsearch ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21144162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com