2014-10-27 80 views
0
public class User 
{ 
    public string Email { get; set; } 
} 

client.Index(new User { Email ="[email protected]" }); 

查询Linq中的C#例如:平等查询由Nest客户

rep.Where(user=>user.Email=="[email protected]"); 

这正常工作。

我用同一个查询在鸟巢:

client.Search<Post>(q => q 
.Query(qu => qu 
.Term(te=>te.OnField("email").Value("[email protected]")))); 

文档结果计数为零!

但是:

client.Search<Post>(q => q 
.Query(qu => qu 
.Term(te=>te.OnField("email").Value("test")))); 

文档结果计数为1 - 为什么?

我如何在ElasticSearch中进行同等查询?

回答

2

这都是因为分析仪。您的文档在索引编制时会被解析为术语,这意味着elasticsearch存储类似于您的文档中的字符串数组["test", "test", "te"]。根据分析器的配置(我猜它是standard之一),你可能会得到不同的分词。另一方面,您的任期请求没有被分析;这就是为什么第一个请求不返回任何内容 - 在索引字符串["test", "test", "te"]中没有“[email protected]”这样的字符串,但是有一个“测试”字符串,所以您可以得到第二个字符串的结果。在你的情况下,你应该使用query_string query,但要小心这样的查询也被分析过。这意味着,如果您索引两个文档,说{"Email":"[email protected]"}{"Email":"[email protected]"},没有任何标志查询{"query":{"query_string":{"default_field":"Email","query":"[email protected]"}}}将返回这两个文档,因为它们都包含索引中的"test"字符串。为了避免这种情况,请使用类似{"default_field":"Email","query":"[email protected]", "default_operator":"AND"}}}的内容 - 默认的默认操作符是"OR"

说到巢,使用查询像

client.Search<Post>(q => q 
    .Query(qu => qu 
    .QueryString(qs=>qs 
     .OnField(x=>x.Email).Query("[email protected]").Operator(Operator.and) 
     ) 
    ) 
);