Java 使用lucene进行前缀搜索
我正在尝试使用lucene搜索功能进行自动完成。我有下面的代码,它通过查询前缀进行搜索,但同时它也提供了包含该单词的所有句子,而我希望它只显示以该前缀开头的句子或单词 例如:m --假日mansion游艇 --眼睛m肌肉 --m历来的绵羊 --machine 我希望它只显示最后2个查询。如何做到这一点,我在这里也结结巴巴的,我是新来的lucene。有谁能帮我一下吗。提前谢谢Java 使用lucene进行前缀搜索,java,lucene,Java,Lucene,我正在尝试使用lucene搜索功能进行自动完成。我有下面的代码,它通过查询前缀进行搜索,但同时它也提供了包含该单词的所有句子,而我希望它只显示以该前缀开头的句子或单词 例如:m --假日mansion游艇 --眼睛m肌肉 --m历来的绵羊 --machine 我希望它只显示最后2个查询。如何做到这一点,我在这里也结结巴巴的,我是新来的lucene。有谁能帮我一下吗。提前谢谢 addDoc(IndexWriter w, String title, String isbn) throw
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
如果我正确理解了您的场景,您希望在标题字段上自动完成
解决方案是有两个字段:一个是已分析的字段,用于对其进行查询;另一个是未分析的字段,用于对标题进行索引,而不将其拆分为单独的术语。
您的自动完成逻辑应该对未分析的字段发出前缀查询,以仅匹配第一个单词。您的术语查询应该针对标题中的匹配项的分析字段发出
我希望这是有意义的。我看到两种解决方案:
//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);