【发布时间】: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