Java 使用lucene进行前缀搜索

Java 使用lucene进行前缀搜索,java,lucene,Java,Lucene,我正在尝试使用lucene搜索功能进行自动完成。我有下面的代码,它通过查询前缀进行搜索,但同时它也提供了包含该单词的所有句子,而我希望它只显示以该前缀开头的句子或单词 例如:m --假日mansion游艇 --眼睛m肌肉 --m历来的绵羊 --machine 我希望它只显示最后2个查询。如何做到这一点,我在这里也结结巴巴的,我是新来的lucene。有谁能帮我一下吗。提前谢谢 addDoc(IndexWriter w, String title, String isbn) throw

我正在尝试使用lucene搜索功能进行自动完成。我有下面的代码,它通过查询前缀进行搜索,但同时它也提供了包含该单词的所有句子,而我希望它只显示以该前缀开头的句子或单词

例如:m --假日mansion游艇 --眼睛m肌肉 --m历来的绵羊 --machine

我希望它只显示最后2个查询。如何做到这一点,我在这里也结结巴巴的,我是新来的lucene。有谁能帮我一下吗。提前谢谢

       addDoc(IndexWriter w, String title, String isbn) throws IOException {
    Document doc = new Document();
    doc.add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED));

    // use a string field for isbn because we don't want it tokenized
    doc.add(new Field("isbn", isbn, Field.Store.YES, Field.Index.ANALYZED));
    w.addDocument(doc);

 }
主要内容:

试试看{
//0.指定用于标记文本的分析器。
//应使用相同的分析器进行索引和搜索
StandardAnalyzer=新的StandardAnalyzer();
//1.创建索引
目录索引=FSDirectory.open(新文件(indexDir));
IndexWriter writer=newindexwriter(索引,新标准分析器(Version.LUCENE_30),true,IndexWriter.MaxFieldLength.UNLIMITED);//3
对于(int i=0;i
如果我正确理解了您的场景,您希望在标题字段上自动完成

解决方案是有两个字段:一个是已分析的字段,用于对其进行查询;另一个是未分析的字段,用于对标题进行索引,而不将其拆分为单独的术语。 您的自动完成逻辑应该对未分析的字段发出前缀查询,以仅匹配第一个单词。您的术语查询应该针对标题中的匹配项的分析字段发出

我希望这是有意义的。

我看到两种解决方案:

  • 按照Yahnoosh的建议,将标题字段保存两次,一次作为TextField(=已分析),一次作为StringField(未分析)

  • 将其另存为TextField,但在查询时使用SpanFirstQuery

  • //2。查询
    术语=新术语(“标题”,querystr);
    //创建术语查询对象
    PrefixQuery pq=新的PrefixQuery(术语);
    SpanQuery包装器=新的spanMultiTermQueryRapper(pq);
    Query final=new SpanFirstQuery(包装器,1);
    

    退房。对不起,我的问题不是突出显示。我想进行d搜索,只显示以该字母开头的内容。非常感谢:)它可以工作。但现在我的问题是它需要很多时间来显示。它还显示重复的单词。如何使它只显示一个单词。就像我有彩票,彩票。应该只显示1次嗨Veena我很乐意帮忙。你能用另一个帖子和例子来回答这个新问题吗。其他人会更容易找到它。谢谢
        try {
            // 0. Specify the analyzer for tokenizing text.
            //    The same analyzer should be used for indexing and searching
            StandardAnalyzer analyzer = new StandardAnalyzer();
    
            // 1. create the index
            Directory index = FSDirectory.open(new File(indexDir));
            IndexWriter writer = new IndexWriter(index, new StandardAnalyzer(Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED); //3
    
            for (int i = 0; i < source.size(); i++) {
                addDoc(writer, source.get(i), + (i + 1) + "z");
            }
    
            writer.close();
    
    
            // 2. query
          Term term = new Term("title", querystr);
          //create the term query object
         PrefixQuery query = new PrefixQuery(term);
    
    
    
            // 3. search
            int hitsPerPage = 20;
            IndexReader reader = IndexReader.open(index);
            IndexSearcher searcher = new IndexSearcher(reader);
            TopScoreDocCollector collector =      TopScoreDocCollector.create(hitsPerPage, true);
            searcher.search(query, collector);
            ScoreDoc[] hits = collector.topDocs().scoreDocs;
    
            // 4. Get results
            for (int i = 0; i < hits.length; ++i) {
                int docId = hits[i].doc;
                Document d = searcher.doc(docId);
    
                System.out.println(d.get("title"));
    
    
            }
    
            reader.close();
    
    
        } catch (Exception e) {
            System.out.println("Exception (LuceneAlgo.getSimilarString()) : " + e);
        }
    
    
    }
    
    
     }
    
    // 2. query
    Term term = new Term("title", querystr);
    //create the term query object
    PrefixQuery pq = new PrefixQuery(term);
    SpanQuery wrapper = new SpanMultiTermQueryWrapper<PrefixQuery>(pq);
    Query final = new SpanFirstQuery(wrapper, 1);