2015-04-14 3 views
1

Я установил fulltext autoindex в своем Neo4j db.Оптимизация индекса neo4j lucene

Чтобы быть ясным, в этом случае Neo4j всегда использует Lucene для выполнения индекса. У меня сейчас около 20 миллионов узлов, и это может скоро увеличиться до более чем 40 миллионов узлов.

Для большинства выполнения запросов отлично, почти мгновенно, но иногда запросы как

"*term*" 

занять до 20 секунд, чтобы вернуться.

Не могли бы вы поделиться некоторыми советами по оптимизации Neo4j и Lucene для выполнения более быстрого поиска в полнотекстовом режиме? Может быть, мне нужно изменить некоторые свойства кеширования?

Основная конфигурация хорошо объяснена в документах, но любые хорошо написанные руководства по настройке и/или изменению поведения Lucene внутри Neo4j трудно найти.

+0

Возможно, вы можете поделиться своим datamodel и запросом/кодом? –

ответ

1

Я думаю, что ваша главная проблема заключается в том, что вы используете ведущий шаблон. See other answers about lucene performance in general on leading wildcards.

Если вы ищете простой термин, вы можете извлечь термины из документов и связать их с отдельными узлами этим термином, чтобы вы могли использовать графические соединения для доступа к документам, содержащим термин.

Независимо от того, как вы строите свой индекс, этот запрос «term» должен смотреть на каждую возможную подстроку каждой строки в вашей базе данных, что займет много времени.

Вы можете посмотреть в tokenizing документы и извлечения этих ключевых терминов, так что вы в конце концов что-то вроде этого:

(d:Document)-[:contains]->(t:Term { term: "foo" }); 

Затем, когда вы хотите знать, какие документы есть «Foo» в них, вы не делаете Lucene больше, но это:

MATCH (t:Term {term: "foo"})<-[:contains]-(d:Document) 
RETURN d; 

Я ожидаю, что это будет много, много, гораздо быстрее, но может потребовать от вас, чтобы сделать это термин извлечение на переднем конце. Он также будет работать в основном для простых терминов, а не для запросов, таких как [foo? O? O? Bar]

Смежные вопросы