簡體   English   中英

MongoDB 文本搜索過濾器按多個字段

[英]MongoDB text search filter by multiple fields

我有以下文檔結構。

{
   content: 'cat dog bird',
   uid: <another_unique_id>
   cid: <another_unique_id>
}

我正在嘗試搜索此集合並希望按uid和/或cid過濾結果。 我想運行的一些查詢:

1) db.mycollection.find({uid: '1', cid: '2', $text: {$search: 'cat'}});         
2) db.mycollection.find({cid: '2', $text: {$search: 'cat'}});
3) db.mycollection.find({uid: '1', $text: {$search: 'cat'}});
4) db.mycollection.find({$text: {$search: 'cat'}});
//etc...

我試圖創建一個這樣的復合索引

db.mycollection.ensureIndex({uid: 1, cid: 1, content: 'text'});

但它僅適用於查詢 #1,如果我不提供其中一個字段,則會出現以下錯誤。

planner returned error: failed to use text index to satisfy $text query 
(if text index is compound, are equality predicates given for all prefix fields?)

我嘗試過的其他事情:

  1. uid / cid = 上創建非復合索引會導致掃描大量文檔

  2. 在文本索引之后移動uid cid索引,即

    db.mycollection.ensureIndex({content: 'text', uid: 1, cid: 1});

    與未使用的 #1 uid 和 cid 索引相同。

關於我正在嘗試的信息: http : //docs.mongodb.org/manual/tutorial/limit-number-of-items-scanned-for-text-search/

我是否遺漏了某些東西,或者使用索引的 MongoDB 無法做到這一點?

不僅 完全記錄了預期的行為,而且我還發現您的斷言是錯誤的。 在可以滿足您指定條件的標准樣品上,結果將如圖所示。 但首先是文檔參考:

  • 如果復合文本索引包括在文本索引鍵之前的鍵,要執行 $text 搜索,查詢謂詞必須在前面的鍵上包含相等匹配條件。

然后是有效查詢的解釋輸出:

{
    "queryPlanner" : {
       "plannerVersion" : 1,
       "namespace" : "test.mycollection",
       "indexFilterSet" : false,
       "parsedQuery" : {
           "$and" : [
               {
                   "cid" : {
                       "$eq" : 2
                   }
               },
               {
                   "uid" : {
                       "$eq" : 1
                   }
               },
               {
                   "$text" : {
                       "$search" : "cat",
                       "$language" : ""
                   }
               }
          ]
      },
      "winningPlan" : {
          "stage" : "TEXT",
          "indexPrefix" : {
               "uid" : 1,
               "cid" : 2
          },
          "indexName" : "uid_1_cid_1_content_text",
          "parsedTextQuery" : {

          }
      },
      "rejectedPlans" : [ ]
  },
  "serverInfo" : {
      "host" : "trashbox",
       "port" : 27017,
       "version" : "3.0.0",
       "gitVersion" : "a841fd6394365954886924a35076691b4d149168"
  },
  "ok" : 1
}

因此,如果您想發出具有不同模式的查詢,即您實際創建的“復合鍵”並且符合明確指定的規則,那么您可能還應該注意要點:

  • 一個集合最多可以有一個文本索引。

因此,在“任何形式”的復合或其他形式中,如果您正在尋求 MongoDB 文本索引的多個定義,那么您不能這樣做。 這同樣適用於“地理空間”索引,以及在$or表達式或.sort()查詢引擎一次只能選擇一個索引的一般考慮。

現代版本應該報告非常具體的行以及錯誤:

(如果文本索引是復合的,是否為所有前綴字段給出了等式謂詞?)

因此,“所有”字段都是必需的,並且它們“必須”完全匹配而不使用不等式運算符。

如果您不打算“始終”使用其他字段作為具有“完全匹配”條件的查詢的一部分,那么您將無法與文本搜索一起形成復合索引。

暫無
暫無

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

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