Java 对数亿文本内的正则表达式搜索的任何建议(存储在MongoDB中)

Java 对数亿文本内的正则表达式搜索的任何建议(存储在MongoDB中),java,regex,mongodb,solr,lucene,Java,Regex,Mongodb,Solr,Lucene,以下是场景: 文本字段当前存储在MongoDB中 字段平均大于1KB,因此无法索引 需要对文本字段执行精确的短语搜索 搜索要求如下: 应该能够为(任何)单个或多个字符(如?、*或()(.*))使用占位符/通配符 应该能够指示短语在搜索文本中的位置(开始、任何位置、结束:phrase%,%phrase%,%phrase) 结果应该是完全匹配的 我已经尝试过的: 字段不可索引,因为mongodb对索引字段有1KB的限制 将文本拆分为1KB的块,当搜索的短语不是(^PHASE)时,正则表达式

以下是场景:

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

  • 应该能够为(任何)单个或多个字符(如
    *
    ()(.*)
    )使用占位符/通配符
  • 应该能够指示短语在搜索文本中的位置(开始、任何位置、结束:
    phrase%
    %phrase%
    %phrase
  • 结果应该是完全匹配的
我已经尝试过的:

  • 字段不可索引,因为mongodb对索引字段有1KB的限制
  • 将文本拆分为1KB的块,当搜索的短语不是(^PHASE)时,正则表达式仍然很慢,并且不使用索引
  • 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中搜索200000个文档需要在我的工作站上大约900ms)
搜索的solr字段类型为:

<fieldType name="text_keyword_lowercase" class="solr.TextField" positionIncrementGap="100">
 <analyzer>
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
 </analyzer>
</fieldType>

有什么建议吗

谢谢

您提到:

当搜索的短语不是(^PHASE)时,正则表达式仍然很慢,并且没有使用索引

那么,是否可以强制它始终使用该正则表达式来提高性能?
我的意思是,在每个搜索查询的开头插入
(^.\*)
,这样完整的正则表达式看起来像:
(^.\*短语)


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

MongoDBs文本搜索仍然是预览版,不适用于生产。如果您能让MongoDb服从您的意愿,并让它执行您需要的查询,我预计性能会很差。你应该用Solr或ElasticSearch更仔细地观察Lucene,如果你不能理解实现的某个方面,可能会返回一个更具体的有针对性的问题。我完全同意。我希望有人有类似要求的经验,并会建议一个选项。@WiredPairie我在Solr/ElasticSearch方面没有经验,您认为/知道ElasticSearch更适合/在这种情况下可以提供更好的性能吗?谢谢没有测试,很难判断。但是,我不相信MongoDB 2.4解决方案也能发挥同样的作用。