[英]Equal query in Elasticsearch by Nest client
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"]
的內容。 根據分析儀的配置(我猜這是標准的 ),您可能會得到不同的分解術語。 另一方面,不分析您的任期要求; 這就是為什么第一個請求什么都不返回的原因-索引字符串["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)
)
)
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.