我想知道是否可以在MongoDB文本搜索中仅禁用停用词过滤。有时我只想搜索“你”,“我”,“是”等字样。我仍然希望利用词干。 不是停止词过滤。
db.collection.find({$text: {$search: "you"}}
以上不会返回任何结果。
但是像
这样的传统方法 db.collection.find({shortDescription: new RegExp(".*you.*",'i')})
会给我我想要的东西。
那么,我怎样才能进行文本搜索,但也可以搜索这些单词(停用单词)。
答案 0 :(得分:1)
您可以通过在创建文本索引时更改其语言值来禁用停用词。从MongoDB文档中:
如果您将语言值指定为“ none”,则文本搜索将使用简单的标记化,其中没有停用词列表,也没有词干[source]。
因此,使用以下方法创建索引:
db.collection.createIndex(
{ content : "text" },
{ default_language: "none" }
)
答案 1 :(得分:0)
为text-indexed
字段插入任何文本时。过滤文本后创建索引值。
因此,当您搜索任何停用词时,它不会出现在索引值列表中。这就是它永远不会搜索停用词的原因。它是按设计设计的,可能是不可编辑的。您必须使用Regex
作为此类标准。我希望没有其他方法可供使用。
答案 2 :(得分:0)
由于您想要词干,所以我假设永远不会有 just 停用词,但也总是至少有一个“正常”词。最重要的是,我希望您确切地知道哪个想要停止的单词。
在这种情况下,我建议将停用词加引号。 As the docs say,如果存在短语“搜索将使用搜索字符串中的各个术语对短语进行逻辑AND
”。幸运的是,似乎没有从短语中删除停用词。
例如,假定包含以下文档的集合:
{"text": "I love blueberries"},
{"text": "She loves blueberries"},
{"text": "She loved the last blueberry most."}
每次搜索blueberry
,blueberry I
或blueberries she
都会返回所有三个集合。但是搜索blueberries "she"
仅返回最后两个集合,即,将考虑词干并强制使用停用词。
遗憾的是,如果您正在搜索 just 停用词,则此方法将无效,即搜索"she"
不会返回任何内容。另外,您不能OR
使用几个停用词:如果您在前两个文档中分别添加“和我”,以使它们成为“我爱蓝莓和我”和“她分别爱我和蓝莓”,搜索blueberry "she" "me"
只会返回第二个文档。
但是,请注意可能是其他单词的一部分的极短的停用词:在我的测试数据库中,搜索blueberry "I"
返回的都是 和第二份文档-我认为是由于“ blueberr i
es”中的i
。