2011-12-28 1 views
0

Lucene 색인을 검색하여 "패턴"필드에 4 번 이상 "C"단어가 포함 된 문서 만 얻는 방법과 "CN "적어도 4 번, 그리고 단어"N "은 적어도 2 번?주어진 검색어 용어 빈도가있는 Lucene 문서를 모두 찾으십시오.

여기에 내가 뭘 내용은 다음과 같습니다

내가 천천히 루씬과 그립에 받고 있어요,하지만 아직 갈 길이 멀다있다. 나는 물 (H2O)과 같은 화합물이 "OHHOH 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()를 사용한다. (내가 다른 작업을해야합니까?)

유사성 검색 코드는 괜찮은 결과를 제공하지만 더 많은 테스트가 필요합니다.

"하위 구조 검색"에도 색인을 사용하고 싶습니다. 즉 누군가가 반지 (탄소 4 개와 질소 2 개)에 6 개의 원자를 가진 화학 하부 구조를 스케치하면 그 반지를 하부 구조로 포함하는 모든 구조체를 그에게주고 싶습니다.

복잡한 경우에는 하위 그래프 동형 검색이 필요합니다. 이를 텍스트 검색 사례로 변환하여 명백한 불일치를 거부 할 수 있습니다. 해당 링에 대한 패턴 문서는 "C C N C C N CN CC CN CN CC CN"입니다. 이 고리 하부 구조를 포함하는 모든 화합물은 적어도 4 "C", 2 "N", 4 "CN"및 2 "CC"를 갖는 상응하는 패턴 문서를 가져야합니다. 따라서 비싼 서브 그래프 동형 검색 코드를 패턴 주파수를 기반으로 한 필터로 대체 할 수 있습니다.

문제는 주파수 기반 쿼리를 지정하는 방법을 모르겠다는 것입니다.

답변

0

구조를 변경하면 필터로 쉽게 검색 할 수 있습니다.

화합물의 원자 수를 보유하는 각 요소마다 다른 필드를 고려하십시오. 따라서 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]

+0

과 비슷할 것입니다. (나는 구리에 대해 [Cu]와 같은 용어를 사용하기 때문에 일부 필드를 인코딩해야하지만 어렵지는 않습니다.) 유사성을 위해이 필드를 사용할 수 있습니까, 아니면 "패턴"필드를 유지해야합니까? –

+0

제가 제안하는 것은 주기율표의 각 원자에 대한 필드를 만드는 것입니다. 각 필드에 대해 원자 수를 저장합니다. 유사성 부분에 대해 동일한 양의 원자를 가진다면 비슷한 결과를 얻는데 충분하다면 다른 필드는 필요하지 않습니다. 범위 쿼리로 검색하면됩니다. 그러나 결합이 중요한 경우 '패턴 : OH CO'와 같은 패턴을 유지하기위한 필드를 추가하십시오. – hkn

관련 문제