簡體   English   中英

如何查詢使用... olivere / elastic?

[英]how to query using ... olivere / elastic?

我正在嘗試使用 github.com/olivere/elastic 在 elasticsearch 上搜索文檔,但我無法創建查詢...

我需要結果...

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "recipient_id": 111
                    }
                }
            ]
        }
    }
}

但是在代碼中...

import "github.com/olivere/elastic"

boolQuery := elastic.NewBoolQuery()
mustQueries := make([]elastic.Query, 0)
mustQueries = append(mustQueries, elastic.NewMatchQuery("recipient_id", 11))
boolQuery.Must(mustQueries...)

src, _ := boolQuery.Source()
PrintQuery(src)
func PrintQuery(src interface{}) {
    fmt.Println("*****")
    data, err := json.MarshalIndent(src, "", "  ")
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))
}

結果

{
  "bool": {
    "must": {
      "match": {
        "recipient_id": {
          "query": 11
        }
      }
    }
  }
}

你要離開這個...請你幫幫我好嗎?

這是我進行查詢的代碼

func Search() {
    client, err := GetClient()
    if err != nil { panic(err) }

    boolQuery := elastic.NewBoolQuery()
    mustQueries := make([]elastic.Query, 0)
    mustQueries = append(mustQueries, elastic.NewMatchQuery("recipient_id", 111))
    boolQuery.Must(mustQueries...)

    searchResult, err := client.Search().
        Index(NameIndex).
        Type("_search").
        Query(boolQuery).
        Do(context.Background())

    fmt.Println(searchResult)
    fmt.Println(searchResult)
}

我從你的帖子中解釋兩個問題

  1. 為什么查詢必須包含 object 項而不是數組項?
  2. 為什么匹配查詢的格式不同?

問題 1 的答案

在下面的代碼片段中,您只在 must 查詢中放置了一個匹配查詢。

mustQueries := make([]elastic.Query, 0)
mustQueries = append(mustQueries, elastic.NewMatchQuery("recipient_id", 111))

因此匹配元素包含一個 object 項,如下所示

"must": {
   "match": {
      "recipient_id": {
         "query": 11
       }
    }
 }

如果在 must 查詢中再放置一個 match 查詢,您將得到一個數組項。 以下代碼片段生成一個帶有數組項的匹配元素。

mustQueries := make([]elastic.Query, 0)
mustQueries = append(mustQueries, elastic.NewMatchQuery("recipient_id", 111))
mustQueries = append(mustQueries, elastic.NewMatchQuery("recipient_name", 'tom'))

上面的代碼片段產生以下查詢

"must": [
   {
      "match": {
         "recipient_id": {
            "query": 11
         }
      }
   },
   {
      "match": {
         "recipient_name": {
            "query": "tom"
         }
      }
   }
]

問題 2 的答案

NewMatchQuery(...,...) API 生成全文匹配查詢。 這就是原因,你得到以下匹配查詢

"match": {
   "recipient_id": {
      "query": 11
   }
}

而不是下面的。

"match": {
   "recipient_id": 11
}

最后,查詢您期望的內容和查詢代碼生成的內容獲取相同的結果。

順便說一句:您的帖子給了我解決問題的提示,並最終回答了您的問題。 謝謝你。

暫無
暫無

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

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