这是场景:
- 文本字段目前存储在 MongoDB 中;
- 字段平均大于 1KB,无法索引;
- 需要对文本字段执行精确的短语搜索;
搜索要求如下:
- 应该能够为(任何)单个或多个字符(如
?
,*
或(.)(.*)
)使用占位符/通配符; - 应该能够指示短语在搜索文本中的位置(开始、任何地方、结束:
phrase%
、、、%phrase%
)%phrase
; - 结果应该是完全匹配的。
我已经尝试过的:
- 字段不可索引,因为 mongodb 对索引字段有 1KB 的限制;
- 将文本拆分为 1KB 块,正则表达式仍然很慢,并且在搜索短语不是时不使用索引 (^phrase);
- MongoDB全文搜索-不确定我是否可以查询位置和短语的完全匹配;
- 尝试使用 Solr,没有运气(启用 ComplexPhraseQueryParser);
- ComplexPhraseQueryParser(支持通配符)内置在 lucene 中,但不知道如何指示搜索短语在文本中的位置以及如何仅获得完全匹配;
当前可能的解决方案是将文本字段保留在 RDBMS 中(MySQL,这是个好主意吗?不确定 varchar 和文本字段索引限制)并使用 LIKE 运算符,但我很想听听一些建议:
- 将它全部放在 MongoDB 中并使用它的内置功能会很棒;
- 或使用 solr,因为它将用于其他搜索功能,可靠、可扩展等;
- 或使用与 solr 相同的 lucene,但必须自己处理可扩展性、复制和其他问题;
- 还有其他选择吗?
更新:
我得出的结论是,当前的 MongoDB 版本无法满足要求,因此向 solr 方向移动了一点。这是我到目前为止所得到的:
- Solr 查询工作 (
/.*sear.* ph.ase.*/
); - 正则表达式搜索文本开头的速度和预期的一样快(
/sear.* ph.ase.*/
); - 其他的,中间和结尾(
/.*sear.* ph.ase.*/
,/.*sear.* ph.ase/
)有点慢(在 solr 中搜索 200,000 个文档在我的工作站上大约需要 900 毫秒);
搜索到的 solr 字段类型为:
<fieldType name="text_keyword_lowercase" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
对此有何建议?
谢谢!