簡體   English   中英

Nest Client在Elasticsearch中進行相等查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM