gpt4 book ai didi

java - 在数亿文本中进行正则表达式搜索的任何建议(存储在 MongoDB 中)

转载 作者:行者123 更新时间:2023-11-29 09:03:57 25 4
gpt4 key购买 nike

场景如下:

  • 文本字段目前存储在 MongoDB 中;
  • 字段平均大于1KB,因此无法被索引;
  • 需要对文本字段执行精确的短语搜索;

搜索的要求如下:

  • 应该能够为(任何)单个或多个字符(如 ?*(.)(.*));
  • 应该能够指出短语在搜索文本中的位置(开始、任何地方、结束:phrase%%phrase%%phrase );
  • 结果应完全匹配。

我已经尝试过的:

  • 字段不可索引,因为 mongodb 对索引字段有 1KB 的限制;
  • 将文本拆分为 1KB 的 block ,正则表达式仍然很慢并且在搜索的短语不是 (^phrase) 时不使用索引;
  • MongoDB 全文搜索 - 不确定我是否可以查询位置和短语的精确匹配;
  • 尝试使用 Solr,但没有成功(启用 ComplexPhraseQueryParser);
  • ComplexPhraseQueryParser(支持通配符)内置于 lucene 中,但不知道如何指示搜索词组在文本中的位置以及如何仅获得完全匹配;

当前可能的解决方案是将文本字段保留在 RDBMS 中(MySQL,这是个好主意吗?不确定 varchar 和文本字段索引限制)并使用 LIKE 运算符,但我很想听听一些建议:

  • 如果能将所有这些都放在 MongoDB 中并使用它的内置功能,那就太好了;
  • 或使用 solr,因为它将用于其他搜索功能、可靠、可扩展等;
  • 或者使用lucene,和solr一样,但是需要自己处理可扩展性、复制等问题;
  • 还有其他选择吗?

更新:

我得出的结论是,当前的 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>

对此有什么建议吗?

谢谢!

最佳答案

你提到过:

regex is still slow and is not using index when searched phrase is not (^phrase)

那么是否可以强制它始终使用该正则表达式来提高性能?
我的意思是,在每个搜索查询的开头插入 (^.\*) 因此完整的正则表达式如下所示:(^.\*phrase)

当然,您必须在搜索短语的开头检查 ^,如果找到,要么先将其删除,要么不要注入(inject) (^.\*)

关于java - 在数亿文本中进行正则表达式搜索的任何建议(存储在 MongoDB 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16011833/

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