簡體   English   中英

如何使用NEST准確表示此ElasticSearch查詢?

[英]How do I accurately represent this ElasticSearch query using NEST?

背景/目標

我在ElasticSearch中有一個查詢,我在幾個字段上使用過濾器(相對較小的數據集,我們確切地知道在查詢時這些字段中應包含哪些值)。 這個想法是,我們將執行全文查詢,但前提是我們已經過濾掉用戶做出的某些選擇。

我將ElasticSearch放在WebAPI控制器后面,並認為使用NEST完成查詢是有意義的。

查詢,用簡單的英語

我們有幾個領域的過濾器。 每個內部過濾器都是“或”過濾器,但它們在一起都是“與”號。

在SQL中,偽代碼等效項是select * from table where foo in (1,2,3) AND bar in (4,5,6)

問題

  • 我可以根據您在下面看到的內容簡化思考該查詢的方式嗎? 我是否忽略了一些基本方法? 這看起來很沉重,但是我是ES的新手。
  • 我如何用NEST語法正確表示以下查詢?
  • NEST是否是最佳選擇? 我應該改為使用ElasticSearch庫並進入較低級別嗎?

查詢文字

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "or": [
                { "term": { "foo": "something" } },
                { "term": { "foo": "somethingElse" } }
              ]
            },
            {
              "or": [
                { "term": { "bar": "something" } },
                { "term": { "bar": "somethingElse" } }
              ]
            }
          ]
        }
      }
    }
  },

  "size": 100
}

這種任務非常簡單,在ES中很流行。 您可以像下面這樣在NEST中表示它:

var rs = es.Search<dynamic>(s => s
            .Index("your_index").Type("your_type")
            .From(0).Size(100)
            .Query(q => q
                .Filtered(fq => fq
                    .Filter(ff => ff
                        .Bool(b => b
                            .Must(
                                m1 => m1.Terms("foo", new string[] { "something", "somethingElse" }),
                                m2 => m2.Terms("bar", new string[] { "something", "somethingElse" })
                            )
                        )
                    )
                    .Query(qq => qq
                        .MatchAll()
                    )
                )
            )
        );

一些注意事項:

  • 我使用過濾查詢來首先過濾需要的內容,然后再搜索內容。 在這種情況下,它將過濾foo in ("something", "somethingElse") AND bar in ("something", "somethingElse") ,然后查詢所有過濾后的結果( match_all )。 您可以將match_all更改為所需的內容。 filtered query是為了獲得最佳性能,因為ES僅需要評估query部分中的文檔分數(過濾后),而不是所有文檔。
  • 我使用terms過濾器,該過濾器比or更加簡單和更好的性能。 terms默認模式是“或”所有輸入術語,您可以在文檔中更多地了解可用模式(“與”,“或”,“普通”等)。

我認為Nest是.NET的最佳選擇,因為它是為簡單易用的目的而設計的。 僅當我想使用當時Nest不支持的新功能,或者Nest在使用的功能中存在錯誤時,才使用較低的API。 您可以在此處參考以獲取簡短的NEST教程: http : //nest.azurewebsites.net/nest/writing-queries.html

更新:動態構建布爾過濾器:

var filters = new List<Nest.FilterContainer>();
filters.Add(Nest.Filter<dynamic>.Terms("foo", new string[] { "something", "somethingElse" }));
// ... more filter

然后將.Bool(b => b.Must(...))替換為.Bool(b => b.Must(...)) .Bool(b => b.Must(filters.ToArray()))

希望對你有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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