2013-05-28 65 views
0

我正在一個網站上工作,我需要存儲用戶編寫的所有文章。每當特定用戶輸入關鍵字時,我需要搜索與該關鍵字相關的文章。眼下正在索引使用Neo4j的Lucene索引的所有文章的文章內容,如下面用java/scala進行Neo4j lucene搜索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() 

這種方法花費更多的時間作爲關鍵字搜索的文章文章數量增加。有沒有更好的方法來做到這一點?

編輯:It'a實際上花更多的時間來搜索,只要搜索關鍵詞包括最喜歡的常用詞「的」,「是」,「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的最佳實踐的直接答案,而是另一種觀點。它在小型AWS機器上在不到一秒的時間內完成50k文檔中的模糊搜索。