簡體   English   中英

Mongodb文本搜索多個字段

[英]Mongodb text search multiple fields

我有一個mongodb文件,看起來像這樣:

document
  title
  suburb
  id
  date

我想添加一個搜索功能,人們可以通過郊區和標題搜索文檔。 我正在使用文本搜索功能,我想要這樣的東西:

var search = {
  $and : [
    { $search:'melbourne' },   // Search in suburb
    { $search:'hello world' }  // As well as in title 
  ]
};
db.ad.find(search).sort([['date', -1]]).limit(10).skip(0, callback);

但上面的代碼不起作用。 我已經將郊區和標題字段編入索引並啟用了文本搜索。

有誰知道如何制作支持兩個不同領域的文本搜索的mongodb子句?

我在mongodb v 2.6中使用mongojs

mongodb中的“文本搜索”概念並不像那樣。 相反,這里的概念是你在“文本索引”中定義“多個字段並只搜索這些術語。

假設你有這樣的“東西”:

{ "_id" : ObjectId("55ba22294bde97b581332979"), "title" : "Hello there" },
{ "_id" : ObjectId("55ba22414bde97b58133297a"), "title" : "Hello world" },
{
    "_id" : ObjectId("55ba22594bde97b58133297b"),
    "title" : "Hello world",
    "suburb" : "melbourne"
}

然后我決定創建一個這樣的文本索引:

db.junk.createIndex(
   { "title": "text", "suburb": "text" },
   { "weights": {  "title": 10 } }
)

然后我使用$text進行搜索:

db.junk.find(
   { "$text": { "$search": "Hello World Melbourne" } },
   { "score": { "$meta": "textScore" } }
).sort({ "score": { "$meta": "textScore" } })

結果如下:

{
    "_id" : ObjectId("55ba22594bde97b58133297b"),
    "title" : "Hello world",
    "suburb" : "melbourne",
    "score" : 11.5
},
{
    "_id" : ObjectId("55ba22414bde97b58133297a"),
    "title" : "Hello world",
    "score" : 1.5
},
{
    "_id" : ObjectId("55ba22294bde97b581332979"),
    "title" : "Hello there",
    "score" : 1
}

哪個“兩個”搜索索引中指定的所有字段,並且還考慮在這種情況下給予“郊區”字段的附加“權重”以使其成為更受歡迎的排名。

因此,您不要使用其他條件,將“所有”條款放在“一個”文本查詢字符串中以搜索多個字段。

如果要在多個字段上應用文本搜索,則無法使用您的解決方案。為此,您需要創建多個索引並將多個字段聲明為“text”。

它完成如下:

db.yourcollectionname.ensureIndex({field1:"text",field2:"text", ...})

然后運行查詢查詢:

db.yourcollectionname.find({$text:{$search:"keywords"}})

如果你的文本搜索仍然不起作用,我發現這篇文章非常有用http://codewhoop.com/article/MongoDb%20Text%20Search%20in%20fields%20of%20document

它包含您需要遵循的所有步驟,成功運行文本搜索查詢,並根據其相關性對結果進行排序。希望它可以幫助您:)

暫無
暫無

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

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