2017-01-09 168 views
1

我知道mongo不支持$正則表達式或類似操作全文搜索此刻它只匹配文本或短語。但我需要執行像索引字段上的查詢搜索。所以,我需要有關多個搜索框架的選擇或其他解決此問題的解決方案方面的幫助。如何在mongodb中使用全文搜索執行「like」查詢?

我有嵌套的文檔結構。對於如:

{ 
"name": "John", 
"phones": [{ 
    "phone_number": "1234", 
    "is_primary": true 
}, { 
    "phone_number": "5678", 
    "is_primary": false 
}] 
} 

我一直在使用Apache Solr實現嘗試,但我發現,它並沒有提供對嵌套文件的良好支持。它將結構扁平化並對字段進行索引,但是當我嘗試像上面討論的那樣執行查詢時,它不起作用。

我正在使用scala,play和mongodb。現在改變嵌套文檔結構是不行的。我可以將哪些合適的搜索平臺與mongodb集成以開發強大的搜索框架?我該如何處理這個問題?這種情況下最好的方法是什麼?

+0

您需要創建'文本索引'來獲得mongodb中的全文搜索支持 –

+0

@ShaishabRoy我已經創建了文本索引。我需要的是在文本搜索中進行$ regex搜索。 – oblivion

+0

執行文本搜索不需要使用'$ regex',你應該使用'$ text'和'$ search'。可以看到我的答案@oblivion –

回答

1

要執行像全文搜索,您可以創建text index然後使用。 more about text index

語法來創建文本索引

db.colectionName.createIndex({ fieldName: "text" }); 

這裏單場你也可以用多個字段創建所示。但請記住

集合最多隻能有一個文本索引。

,那麼你可以搜索使用$text$search

var searchText= 'some text to search'; 
db.collectionName.find({ $text: { $search: searchText} }); 

但要序列匹配或模式匹配無需創建text index可以使用$regex

var searchName ='som'; 
db.collectionName.find({"name":{ $regex: searchName, $options: 'i' }}) 

以上查詢與$regex將部分匹配。例如,在你的數據庫name:'some text to search'所以返回的數據,如果searchName值像somesomomerex ...

有更好的表現能爲name場創建普通索引

+0

我需要執行像查詢與文本搜索。 例如: db.colectionName.createIndex({fieldName:「text」}); db.colectionName.insert({「text」:「要搜索的東西」}); db.collectionName.find({$ text:{$ search:「som」}});正如你所看到的,我的意思是我需要像$正則表達式功能與文本搜索。 – oblivion

+0

'$ regex'用於精確序列匹配或模式匹配,不像'text search' –

+0

我知道,我正在尋找部分文本搜索,我可以使用實際文本的子字符串進行搜索。 – oblivion

0

你能做到這一點的SOLR但你需要事先定義您想要執行的查詢類型,並以創造性的方式平滑索引,以便查詢和檢索您需要的內容。您可以使用多值字段來存儲多個值。如果您的客戶端需要實例化它,您可以將整個對象的JSON版本存儲在文本字段中。

例如,你可以單獨存放初選和仲:

phone_number_primary: 1234,... 
phone_number_secondary: 5678,... 
my_json_blob: {OBJECT HERE} 

然後你可以檢索並分別查詢每個。如果你想搜索你都可以查詢都

(phone_number_primary:1234 OR phone_number_secondary:1234) 

,或者你可以定義架構中的存儲這兩個數字的額外字段:

<copyField source="phone_number_*" dest="phone_number_all" /> 

,然後搜索這個領域。