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