Nest客户端在Elasticsearch中的等同查询

时间:2014-10-27 20:15:39

标签: c# .net elasticsearch nest

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

1 个答案:

答案 0 :(得分:2)

这都是因为分析仪。在编制索引时,您的文档会被解析为术语,这意味着elasticsearch会将类似字符串["test", "test", "te"]的数组存储在您的文档中。根据anayzer的配置(我猜它是standard),你可能会得到不同的术语分解。另一方面,您的期限请求未被分析;这就是为什么第一个请求什么都不返回 - 索引字符串["test", "test", "te"]中没有“test@test.te”这样的字符串,但是有一个“test”字符串,所以你得到第二个字符串的结果。在您的情况下,您应该使用query_string query,但要注意这样的查询也要进行分析。这意味着,如果您索引两个文档,比如说{"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)
        )
    )
);