我知道mongo目前不支持 $ regex或类似操作 全文搜索。它只匹配文字或短语。但我需要在索引字段上执行类似查询搜索。因此,我需要有关选择多个搜索框架或任何其他解决此问题的帮助。
我有嵌套的文档结构。例如:
{
"name": "John",
"phones": [{
"phone_number": "1234",
"is_primary": true
}, {
"phone_number": "5678",
"is_primary": false
}]
}
我尝试使用 Apache Solr ,但我发现它不能为嵌套文档提供良好的支持。它会使结构变平并为字段编制索引,但是当我尝试像上面讨论的那样执行查询时,它不起作用。
我正在使用 scala,play和mongodb 。现在更改嵌套文档结构对我来说是不可行的。有哪些合适的搜索平台可以与mongodb集成以开发强大的搜索框架?我该如何处理这个问题?在这种情况下,最好的方法是什么?
答案 0 :(得分:2)
要像全文搜索一样执行,您可以创建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
值为some
,som
,ome
,rex
,则可以返回数据...
为了获得更好的性能,可以为name
字段
答案 1 :(得分: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" />
然后搜索此字段。