禁用MongoDB文本搜索中的停用词过滤

时间:2018-03-08 11:10:28

标签: javascript node.js mongodb

我想知道是否可以在MongoDB文本搜索中仅禁用停用词过滤。有时我只想搜索“你”,“我”,“是”等字样。我仍然希望利用词干不是停止词过滤

db.collection.find({$text: {$search: "you"}}

以上不会返回任何结果。

但是像

这样的传统方法

db.collection.find({shortDescription: new RegExp(".*you.*",'i')})会给我我想要的东西。

那么,我怎样才能进行文本搜索,但也可以搜索这些单词(停用单词)。

3 个答案:

答案 0 :(得分:1)

您可以通过在创建文本索引时更改其语言值来禁用停用词。从MongoDB文档中:

  

如果您将语言值指定为“ none”,则文本搜索将使用简单的标记化,其中没有停用词列表,也没有词干[source]。

因此,使用以下方法创建索引:

db.collection.createIndex(
   { content : "text" },
   { default_language: "none" }
)

[code source]

答案 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."}

每次搜索blueberryblueberry Iblueberries she都会返回所有三个集合。但是搜索blueberries "she"仅返回最后两个集合,即,将考虑词干并强制使用停用词。


遗憾的是,如果您正在搜索 just 停用词,则此方法将无效,即搜索"she"不会返回任何内容。另外,您不能OR使用几个停用词:如果您在前两个文档中分别添加“和我”,以使它们成为“我爱蓝莓和我”和“她分别爱我和蓝莓”,搜索blueberry "she" "me"只会返回第二个文档。

但是,请注意可能是其他单词的一部分的极短的停用词:在我的测试数据库中,搜索blueberry "I"返回的都是 第二份文档-我认为是由于“ blueberr i es”中的i