Найти все документы Lucene, по крайней мере, с заданными частотами запроса - PullRequest
0 голосов
/ 28 декабря 2011

Как выполнить поиск по индексу Lucene, чтобы получить только те документы, в которых поле «узоры» содержит: слово «C» не менее 4 раз, И термин «CN» не менее 4 раз, И слово «N»по крайней мере, 2 раза?

Вот что я делаю:

Я постепенно начинаю осваивать Lucene, но впереди еще долгий путь.Я использую его для идеи химического поиска, где такое соединение, как вода (H2O), переводится в «документ», содержащий шаблоны «OHH OH OH», а метанол (CH3OH) переводится в шаблоны «CHHHOH CH CH CH CO OH».".

(Фактический код не содержит водородов и использует подструктуры вплоть до размера 7. В среднем документе содержится несколько тысяч" слов ", который содержит много повторов. Я исследую, полезен ли этот подход.)

Я создал индекс, используя что-то вроде (это через интерфейс с пилюценом):

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 атома азота), то я хочу дать им все структуры, которые содержат это кольцо в качестве субструктуры.

В сложном случае, это требует поиска изоморфизма подграфа.Я могу отклонить очевидные несоответствия, преобразовав это в случай текстового поиска.Документ образца для этого кольца - «CCNCCN CN CC CN CN CN CN».Все соединения, которые содержат эту кольцевую подструктуру, должны иметь соответствующий шаблон документа, по крайней мере, с 4 "C", 2 "N", 4 "CN" и 2 "CC".Поэтому я могу заменить некоторые из моих дорогих поисковых кодов изоморфизма подграфов фильтром, основанным на частотах шаблонов.

Проблема в том, что я не знаю, как задать этот частотный запрос.

1 Ответ

0 голосов
/ 28 декабря 2011

Если вы измените свою структуру, вы можете легко искать с фильтрами.

Рассмотрим различные поля для каждого элемента, который содержит количество атомов в соединении. Таким образом, H2O индексируется как h: 2, O: 1, C: 0; СН3ОН индексируется как С: 1, Н: 4, О: 1. Вы также можете добавить другое поле для соединений, таких как ОН.

С этой структурой документа вы можете использовать фильтры и диапазон запросов для поиска. Например, ваш первый запрос будет выглядеть так: C:[4 TO 10000] AND CN:[4 TO 10000] AND N:[2 TO 10000]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...