2013-05-28 2 views
0

Работаю на веб-сайте, где мне нужно хранить все статьи, написанные пользователями. Всякий раз, когда конкретный пользователь вводит ключевое слово, мне нужно искать статьи, связанные с этим ключевым словом. Сейчас я индексировать содержание статьи всех статей с использованием индекса Neo4j Lucene как нижеNeo4j поиск lucene с java/scala API

ArticleContentIndex += (article_node,"article_data",a_data) 

и поиск статей на основе ключевых слов, как показано ниже

val article_content_index = getNodeIndex("article_content").get 
val w = "*"+word+"*" 
val articles = article_content_index.query("article_data",w).iterator() 

Этот подход занимает больше времени в качестве количество статей увеличивается. Есть ли лучший способ сделать это?

EDIT: It'a фактически занимать больше времени, чтобы искать каждый раз, когда ключевое слово поиска состоит наиболее употребительные слова, как «», «есть», «а» и т.д.

ответ

3

Я не пытался использовать Neo4j с lucene, но в качестве альтернативы вы можете использовать RAMDirectory.

val analyzer = new StandardAnalyzer(Version.LUCENE_43) 
val index = new RAMDirectory() 
val config = new IndexWriterConfig(Version.LUCENE_43, analyzer) 

Тогда при запуске Lucene вы можете добавить свои данные в индекс:

mkIndex(xs: Iterable[Articles]) 

Указатель содержит документы:

def mkIndex(xs: Iterable[Articles]) { 
    def withWriter[T](f: IndexWriter => T): T = { 
    val iw = new IndexWriter(index, config) 
    Try(f(iw)) match { 
     case Success(_) => iw.close() 
     case Failure(e) => // do something with exception 
    } 

    withWriter { _.addDocuments(xs.map(mkDoc)) } 
} 

так что нам нужно сделать документ:

def mkDoc(art: Article): Document = make(new Document) { doc => 
    doc add TextField("id", art.id.toString) 
    doc add TextField("data", art.content) 
    doc add TextField("author", art.author) 
} 

Итак, когда индекс готов, вы требуется функция поиска:

/** 
* id - your article ID, 
* field - the default field for query terms 
* lim - limit results 
*/ 
def search(id: String, field: String, lim: Int): Seq[Article] = { 
    val reader = DirectoryReader.open(index) 
    val searcher = new IndexSearcher(reader) 
    val collector = TopScoreDocCollector.create(lim, true) 

    val q = new QueryParser(Version.LUCENE_43, field, analyzer).parse(id) 
    searcher.search(q, collector) 
    val hits = collector.topDocs().scoreDocs 
    val results = hits map { hit => searcher doc hit.doc } 
    reader.close() 

    results map { doc => Article(doc.get("id"), doc.get("data"), doc.get("author")) } 
    } 

С помощью этой функции поиска вы можете выполнить поиск нечеткого поиска или поиск по шаблону.

Это не прямой ответ на лучший способ использования Neo4j, но альтернативный вид. Он собирает нечеткое изображение в 50-килограммовых документах менее чем за секунду на небольшой машине AWS.

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