“如何执行”;例如;在mongodb中使用全文搜索进行查询?

“如何执行”;例如;在mongodb中使用全文搜索进行查询?,mongodb,scala,solr,full-text-search,Mongodb,Scala,Solr,Full Text Search,我知道mongo目前不支持$regex或类似的全文搜索操作。它只匹配文本或短语。但我需要在索引字段上执行类似的查询搜索。因此,我需要有关选择多个搜索框架或任何其他解决此问题的方法的帮助 我有嵌套的文档结构。例如: { "name": "John", "phones": [{ "phone_number": "1234", "is_primary": true }, { "phone_number": "5678", "is_primary": false }] }

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

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

{
"name": "John",
"phones": [{
    "phone_number": "1234",
    "is_primary": true
}, {
    "phone_number": "5678",
    "is_primary": false
}]
}
我尝试过使用ApacheSolr,但发现它不能很好地支持嵌套文档。它将结构扁平化并对字段进行索引,但当我尝试执行上面讨论过的类似查询时,它不起作用


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

要像全文搜索一样执行搜索,您可以创建
文本索引
,然后使用

创建文本索引的语法

db.colectionName.createIndex( { fieldName: "text" } );
此处所示为单个字段,您也可以使用多个字段创建。但请记住

一个集合最多可以有一个文本索引

然后,您可以使用
$text
$search

var searchText= 'some text to search';
db.collectionName.find({ $text: { $search: searchText} });
但要进行序列匹配或模式匹配,无需创建
文本索引
即可使用
$regex

var searchName ='som';
db.collectionName.find({"name":{ $regex: searchName, $options: 'i' }})
对于上述查询,使用将部分匹配的
$regex
。例如,在数据库
name:“要搜索的某些文本”
中,如果
searchName
值类似于
some
som
ome
rex
,则可以返回数据


为了获得更好的性能,您可以为
name
field

创建普通索引。您可以在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" />


然后搜索此字段。

您需要创建
文本索引
,以获得中的全文搜索支持mongodb@ShaishabRoy我已经创建了文本索引。我需要的是文本搜索中的$regex搜索。要执行文本搜索,无需使用
$regex
,您应该使用
$text
$search
。可以看到我的答案@oblivioni需要执行类似文本搜索的查询。例如:db.collectionname.createIndex({fieldName:“text”});插入({“text”:“要搜索的某物”});db.collectionName.find({$text:{$search:som}});正如你所看到的,我的意思是我需要一些类似于$regex的功能和文本搜索。
$regex
用于精确的序列匹配或模式匹配,而不像
文本搜索
我知道,我正在寻找部分文本搜索,我可以使用实际文本的子字符串进行搜索。那么使用
文本索引
有什么问题?根据您的第一条评论,您可能无法理解
文本索引
。您使用了
“text”:“somethingtosearch”
来添加无效的新记录,您应该使用
.insert({“fieldName”):“somethingtosearch”
,对于该
字段名
,您应该创建
文本索引
,然后使用
.find({$text:{$search:{$search:som})
这将从
fieldName
值中找到