如何在mongodb中使用全文搜索执行“喜欢”查询?

时间:2017-01-09 06:44:23

标签: mongodb scala solr full-text-search

我知道mongo目前不支持 $ regex或类似操作 全文搜索。它只匹配文字或短语。但我需要在索引字段上执行类似查询搜索。因此,我需要有关选择多个搜索框架或任何其他解决此问题的帮助。

我有嵌套的文档结构。例如:

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

我尝试使用 Apache Solr ,但我发现它不能为嵌套文档提供良好的支持。它会使结构变平并为字段编制索引,但是当我尝试像上面讨论的那样执行查询时,它不起作用。

我正在使用 scala,play和mongodb 。现在更改嵌套文档结构对我来说是不可行的。有哪些合适的搜索平台可以与mongodb集成以开发强大的搜索框架?我该如何处理这个问题?在这种情况下,最好的方法是什么?

2 个答案:

答案 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值为somesomomerex,则可以返回数据...

为了获得更好的性能,可以为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" />

然后搜索此字段。