Nest 客户端在 Elasticsearch 中的相等查询
本文关键字:查询 客户端 Elasticsearch Nest | 更新日期: 2023-09-27 18:28:11
public class User
{
public string Email { get; set; }
}
client.Index(new User { Email ="test@test.te" });
例如,在 Linq C# 中查询:
rep.Where(user=>user.Email=="test@test.te");
这工作正常。
我在 Nest 中使用相同的查询:
client.Search<Post>(q => q
.Query(qu => qu
.Term(te=>te.OnField("email").Value("test@test.te"))));
文档结果计数为零!!
但:
client.Search<Post>(q => q
.Query(qu => qu
.Term(te=>te.OnField("email").Value("test"))));
文档结果计数为 1 - 为什么?
如何在 ElasticSearch 中进行相等查询?
这都是因为分析器。您的文档在索引时被解析为术语,这意味着 elasticsearch 会存储类似于与文档一起["test", "test", "te"]
行的字符串数组之类的内容。根据配置的 anayzer(我想它是标准的(,您可能会得到不同的术语分解。另一方面,不会分析您的期限请求;这就是为什么第一个请求不返回任何内容 - 索引字符串["test", "test", "te"]
中没有像"test@test.te"这样的字符串,但是有一个"test"字符串,所以你会得到第二个请求的结果。在您的情况下,您应该使用query_string查询,但请注意,此类查询也会被分析。这意味着,如果您索引两个文档,例如 {"Email":"test@test.te"}
和 {"Email":"test@gmail.com"}
,没有任何标志查询{"query":{"query_string":{"default_field":"Email","query":"test@test.te"}}}
将返回这两个文档,因为它们都包含索引中的字符串"test"
。为避免这种情况,请使用类似 {"default_field":"Email","query":"test@test.te", "default_operator":"AND"}}}
- 默认默认运算符为 "OR"
。
说到NEST,使用类似查询
client.Search<Post>(q => q
.Query(qu => qu
.QueryString(qs=>qs
.OnField(x=>x.Email).Query("test@test.te").Operator(Operator.and)
)
)
);