【问题标题】:Find all Lucene documents with at least the given query term frequencies查找至少具有给定查询词频率的所有 Lucene 文档
【发布时间】:2011-12-28 00:51:47
【问题描述】:

如何搜索 Lucene 索引以仅获取“模式”字段包含的那些文档:单词“C”至少 4 次,术语“CN”至少 4 次,以及单词“N”至少2次?

这就是我正在做的事情:

我正在慢慢掌握 Lucene,但还有很长的路要走。我将它用于化学搜索的想法,其中像水 (H2O) 这样的化合物被翻译成包含模式“O H H OH OH”的“文档”,甲醇 (CH3OH) 被翻译成模式“C H H H O H CH CH CH CH CO OH ”。

(实际代码省略了氢原子,并使用了大小为 7 的子结构。平均文档中有几千个“单词”,其中包含许多重复。我正在研究这种方法是否有用。)

我使用类似的东西创建了索引(这是通过 pylucene 接口):

dirname = SimpleFSDirectory(File(indexDir))
analyzer = WhitespaceAnalyzer(Version.LUCENE_30)
writer = IndexWriter(dirname, analyzer, True, IndexWriter.MaxFieldLength.UNLIMITED)

for compound_id, patterns in process_molecules(input_molecules):
    doc = Document()
    doc.add(Field("compound_id", compound_id, Field.Store.YES, Field.Index.ANALYZED))
    f = Field("patterns", patterns, Field.Store.YES, Field.Index.ANALYZED)
    f.setOmitNorms(True)
    doc.add(f)
    writer.addDocument(doc)

writer.optimize()
writer.close()

我只使用 WhitespaceAnalyzer,因为我不想要任何词干。我使用 OmitNorms() 因为我不想要任何术语长度标准化。 (我应该做点别的吗?)

相似性搜索代码给出的结果看起来不错,但我需要进行更多测试。

我还想将索引用于“子结构搜索”。也就是说,如果有人勾勒出一个环中有 6 个原子(4 个碳和 2 个氮)的化学子结构,那么我想给他们所有包含该环作为子结构的结构。

在复杂的情况下,这需要子图同构搜索。我可以通过将其转换为文本搜索案例来拒绝明显的不匹配。该环的模式文档是“C C N C C N CN CC CN CN CC CN”。所有包含此环亚结构的化合物都必须具有相应的模式文件,其中至少有 4 个“C”、2 个“N”、4 个“CN”和 2 个“CC”。因此,我可以用基于模式频率的过滤器替换一些昂贵的子图同构搜索代码。

问题是,我不知道如何指定基于频率的查询。

【问题讨论】:

    标签: lucene


    【解决方案1】:

    如果您更改结构,您可以使用过滤器轻松搜索。

    为每个元素考虑一个不同的字段来保存化合物中的原子数。所以 H2O 被索引为 h:2, O:1, C:0; CH3OH 索引为 C:1、H:4、O:1。 您还可以为 OH 等化合物添加另一个字段。

    使用此文档结构,您可以使用过滤器和范围查询进行搜索。 例如,您的第一个查询类似于C:[4 TO 10000] AND CN:[4 TO 10000] AND N:[2 TO 10000]

    【讨论】:

    • 这很容易做到。 (我必须对一些字段进行编码,因为我有像 [Cu] 这样的术语来表示铜,但这并不难。)我是否也可以使用这些字段来实现相似性,或者我是否需要为此保留“模式”字段?
    • 我建议为元素周期表中的每个原子创建一个字段。对于每个字段,您存储原子的数量。对于相似部分,如果具有相同数量的原子足以相似,则丢弃它们之间的键,则不需要其他字段;只需使用范围查询进行搜索。但如果绑定很重要,那么添加一个额外的字段来保存patterns: OH CO 之类的模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 2011-11-23
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多