Lucene Index,对所有索引中插入的查询结果执行新搜索

时间:2019-02-28 15:13:45

标签: performance kotlin lucene

我使用Lucene在1.3亿个文本(每个300个字符)上创建了一个索引。

这是我使用此索引的方式:

import org.apache.lucene.analysis.core.WhitespaceAnalyzer
import org.apache.lucene.index.DirectoryReader
import org.apache.lucene.search.BooleanClause
import org.apache.lucene.search.BooleanQuery
import org.apache.lucene.search.IndexSearcher
import org.apache.lucene.search.MatchAllDocsQuery
import org.apache.lucene.store.NIOFSDirectory
import org.apache.lucene.util.QueryBuilder
import java.nio.file.Path

class LuceneNegativesIndex(val indexFolderPath: Path) : NegativesIndex {
    val standardAnalyzer = WhitespaceAnalyzer()
    var directory = NIOFSDirectory.open(indexFolderPath)

    val reader = DirectoryReader.open(directory)
    val queryBuilder = QueryBuilder(standardAnalyzer)
    val searcher = IndexSearcher(reader)

    val allDocsQuery = MatchAllDocsQuery()

    override fun count(phrase: String, mustNot: List<String>): Long {
        val booleanQueryBuilder = BooleanQuery.Builder()

        val phraseQ = queryBuilder.createPhraseQuery("content", phrase)
        booleanQueryBuilder.add(phraseQ, BooleanClause.Occur.MUST)

        mustNot.forEach {
            val q = queryBuilder.createPhraseQuery("content", it)
            booleanQueryBuilder.add(q, BooleanClause.Occur.MUST_NOT)
        }

        val results = searcher.search(booleanQueryBuilder.build(), 1)
        return results.totalHits
    }

}

为了使之更加简单,请解释一下:

我正在尝试提取包含特定单词的所有文本 并且不包含的mustNot单词列表中的任何单词。 并检索索引中有多少类似的文字

我面临的问题是创建mustNot列表后,它会保持不变,只有我想在文本中找到的词组才会更改。

对运行时进行性能分析后,我发现此功能占整个CPU时间的43%

这就是我的使用方式

fun getAllNegCount(): HashMap<String,Int>{
    val kp2negCount = HashMap<String,Int>()

    val searcher = LuceneNegativesIndex(PATH_TO_INDEX)

    val mustNot = selectBlackList() //size uselly between 10-20 detrmine in run time

    val keyPhrases = getAllKP()//size uselly between 2000-3000 detrmine in run time

    keyPhrases.forEach{kp->
        kp2negCount[kp]= searcher.search(kp,mustNot)
    }

    return kp2negCount

}

如果这是一个合理的SQL数据库,我可能首先要获取所有 mustNot列表中不包含任何单词的文本 然后在那组文本上搜索包含该短语的文本。

但是,相反,我每次都需要在所有索引上运行整个查询。

我找不到对检索到的文档进行搜索的方法。

关于如何解决此问题的任何想法或其他方法?

还是优化此查询的方法?

或者使用Lucene并不是这种用例的最佳解决方案?

0 个答案:

没有答案