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 中进行相等查询?

Nest 客户端在 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)
        )
    )
);