【问题标题】:Lucene - simpleAnalyzer - How to get matched word(s)?Lucene - simpleAnalyzer - 如何获得匹配的单词?
【发布时间】:2012-03-15 07:26:00
【问题描述】:

通过使用以下算法,我无法获得或直接获得单词本身的偏移量。任何帮助将不胜感激

   ...
   Analyzer analyzer = new SimpleAnalyzer();
   MemoryIndex index = new MemoryIndex();

   QueryParser parser = new QueryParser(Version.LUCENE_30, "content", analyzer);

   float score = index.search(parser.parse("+content:" + target));

   if(score > 0.0f)
        System.out.println("How to know matched word?");

【问题讨论】:

    标签: search lucene full-text-search analyzer


    【解决方案1】:

    这是整个内存索引和搜索示例。我刚刚为我自己写了,它运行良好。我知道您需要将索引存储在内存中,但问题是为什么您需要 MemoryIndex 呢?您只需使用 RAMDirectory 代替,您的索引将存储在内存中,因此当您执行搜索时,将从 RAMDirectory(内存)加载索引。

        StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_34);
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_34, analyzer);
        RAMDirectory directory = new RAMDirectory();
        try {
            IndexWriter indexWriter = new IndexWriter(directory, config);
            Document doc = new Document();
            doc.add(new Field("content", text, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_OFFSETS));
            indexWriter.addDocument(doc);
            indexWriter.optimize();
            indexWriter.close();
    
            QueryParser parser = new QueryParser(Version.LUCENE_34, "content", analyzer);
            IndexSearcher searcher = new IndexSearcher(directory, true);
            IndexReader reader = IndexReader.open(directory, true);
    
            Query query = parser.parse(word);
            TopScoreDocCollector collector = TopScoreDocCollector.create(10000, true);
            searcher.search(query, collector);
            ScoreDoc[] hits = collector.topDocs().scoreDocs;
            if (hits != null && hits.length > 0) {
                for (ScoreDoc hit : hits) {
                    int docId = hit.doc;
                    Document hitDoc = searcher.doc(docId);
    
                    TermFreqVector termFreqVector = reader.getTermFreqVector(docId, "content");
                    TermPositionVector termPositionVector = (TermPositionVector) termFreqVector;
                    int termIndex = termFreqVector.indexOf(word);
                    TermVectorOffsetInfo[] termVectorOffsetInfos = termPositionVector.getOffsets(termIndex);
    
                    for (TermVectorOffsetInfo termVectorOffsetInfo : termVectorOffsetInfos) {
                        concordances.add(processor.processConcordance(hitDoc.get("content"), word, termVectorOffsetInfo.getStartOffset(), size));
                    }
                }
            }
    
            analyzer.close();
            searcher.close();
            directory.close();
    

    【讨论】:

    • 您好,感谢您的评论。您可以将样本转换为 memoryIndex 使用情况吗?这就是我使用 memoryIndex 进行全文搜索的原因,我不能像您的代码中那样使用 hits 或 doc。
    • 你好,谢谢,我使用memoryIndex是因为性能和内存问题我了解到MemoryIndex比RAMDirectory更高效、更方便,所以我更喜欢选择MemoryIndex。
    • 那么我的建议是获取 Lucene in Action 书。它将为您节省大量使用 Lucene 的时间和问题。
    • 这个类是 RAMDirectory 功能的一个大子集的替代品/替代品。它旨在实现在实时流应用程序(例如基于 Nux XQuery 的 XML 消息队列、博客/新闻源的发布-订阅系统、文本聊天、数据采集和分发系统)中结合结构化和模糊全文搜索的动态匹配的最大效率、应用级路由器、防火墙、分类器等...lucene.apache.org/core/old_versioned_docs/versions/3_4_0/api/…
    • close 语句应该在 finally 块中,每个语句前面都有一个非空测试。
    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 2020-01-16
    • 2016-05-15
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多