gpt4 book ai didi

c# - MongoDb 中的文本搜索引擎

转载 作者:可可西里 更新时间:2023-11-01 10:04:21 26 4
gpt4 key购买 nike

我正在尝试使用 C# Driver for MongoDb 在我的应用程序中创建搜索功能。

当用户搜索单词列表时,我想首先显示完全匹配(如果存在),然后是最有趣的帖子。

我有一个这样的文本索引:

collection.CreateIndex(IndexKeys<Post>.Text(p => p.BodyPlainText));

我是这样开始的:

var textSearchQueryExact = Query.Matches("BodyPlainText", searchString);
var textSearchQueryFullText = Query.Text(searchString);
var textSearchQuery = Query.Or(textSearchQueryFullText, textSearchQueryExact);

这会生成以下查询:

{  "$or" : [ { "$text" : { "$search" : "My example text" } }, { "BodyPlainText" : /My example text/ }] }

但它不起作用!结果为零,在 MongoVUE 中,我没有收到任何解释。如果我删除两个查询过滤器之一,它会起作用,而两个都不起作用。

我在 Mongo 文档中也发现了这个限制:

"To use a $text query in an $or expression, all clauses in the $or array must be indexed."

但是属性是一样的,而且是索引的。

我错过了什么?

这是实现我想要的结果的正确方法吗?

更新

仅使用具有此语法的 textSearch 查询:

{ "$text" : { "$search" : "il ricorrente lamentava che mentre" } }

由于词干和停用词的详细说明,给我错误的结果(我认为):

enter image description here

最佳答案

好吧,您完全可以按照生成的错误消息说您应该处理它来执行此操作。这实际上是“索引交集”在 MongoDB 2.6 及更高版本中工作方式的一部分。这是“有点”那里$or以前影响查询,但现在有更多的“幕后”。所以基本上添加一个索引,就像错误要求你做的那样:

考虑数据:

db.example.insert({ "text": "This is what I want" })

然后添加索引:

db.example.ensureIndex({ "text": "text" })
db.example.ensureIndex({ "text": 1 })

那么查询就如您所期望的那样工作了:

db.example.find(
{
"$or": [
{ "$text": { "$search": "This is what I want" } },
{ "text": /This is what I want/ }
]
},
{ "score": { "$meta": "textScore" } }
).pretty()

注意到我确实添加了 $meta即使 .sort() 被省略了。但我从评论中得到的几乎是这实际上是一样的:

db.example.find(
{
"$or": [
{ "$text": { "$search": "This is what I want" } }
]
},
{ "score": { "$meta": "textScore" } }
).pretty()

因此,尽管在第一个示例中尝试“相交”,但完全匹配的文档分数将保持不变:

{
"_id" : ObjectId("53870b75015cb64be54d7ecf"),
"text" : "This is what I want",
"score" : 1
}

对于您提到的更多“词干提取”示例,需要考虑以下内容:

db.example.insert({ "text": "these colors are mine" })
db.example.insert({ "text": "This color are mine" })

以及两种查询形式:

db.example.find(
{
"$or": [
{ "$text": { "$search": "This color are mine" } },
{ "text": /This color are mine/ }
]
},
{ "score": { "$meta": "textScore" }}
).pretty()

db.example.find(
{
"$or": [
{ "$text": { "$search": "This color are mine" } }
]
},
{ "score": { "$meta": "textScore" }}
).pretty()

过度使用 $or在所有情况下都在那里,但是复制和粘贴很快。但报告再次返回相同的值:

{
"_id" : ObjectId("53870f5a015cb64be54d7ed0"),
"text" : "these colors are mine",
"score" : 1.5
},
{
"_id" : ObjectId("5387114b015cb64be54d7ed1"),
"text" : "This color are mine",
"score" : 1.5
}

这几乎就是在使用该表单进行查询时排名的排序方式。

关于c# - MongoDb 中的文本搜索引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23930642/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com