如何搜索Lucene索引以仅获取字段“模式”包含的文档:单词“C”至少4次,术语“CN”至少4次,单词“N”至少2次?
这就是我正在做的事情:
我正在慢慢掌握Lucene,但还有很长的路要走。我将它用于化学搜索的想法,其中像水(H2O)这样的化合物被翻译成含有“OHH OH OH”模式的“文件”,甲醇(CH3OH)被翻译成“CHHHOH 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”。因此,我可以使用基于模式频率的过滤器替换我的一些昂贵的子图同构搜索代码。
问题是,我不知道如何指定基于频率的查询。
答案 0 :(得分:0)
如果您更改了结构,则可以使用过滤器轻松搜索。
考虑每个元素的不同字段,其中包含化合物中的原子数。因此H2O被索引为h:2,O:1,C:0; CH 3 OH的索引为C:1,H:4,O:1。 您还可以为OH等化合物添加另一个字段。
使用此文档结构,您可以使用过滤器和范围查询进行搜索。
例如,您的第一个查询就像C:[4 TO 10000] AND CN:[4 TO 10000] AND N:[2 TO 10000]