我把一个对象的所有属性放入一个索引库 , 在然后尝试从里面读取数据 出来 , 但是 读取得到的记录数为 0
这是 对象的代码 package cn.itcast.domain; import java.io.Serializable; public class Article implements Serializable { private int id; private String title; private String content; public Article() { super(); // TODO Auto-generated constructor stub } public Article(int id, String title, String content) { super(); this.id = id; this.title = title; this.content = content; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } 下面是测试的代码 package cn.itcast.lucene.hello; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.StringField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.Term; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.junit.Test; import cn.itcast.domain.Article; public class TestHello { private static final File path = new File("./indexFile/"); @Test public void testCreateIndex() throws Exception { // 创建一个索引目录 Directory directory = FSDirectory.open(path); // 创建一个 分词器 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_42); Article article = new Article(1, "标题一", "我们应该保护资源02"); // 建立索引 Document doc = new Document(); Field id = new StringField("id", article.getId() + "", Field.Store.YES); Field title = new StringField("title", article.getTitle(), Field.Store.YES); Field content = new StringField("content", article.getContent(), Field.Store.YES); doc.add(id); doc.add(title); doc.add(content); // IndexWriter.add... IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42, analyzer); IndexWriter writer = new IndexWriter(directory, config); writer.addDocument(doc); writer.commit(); writer.close(); } @Test public void testSearch() throws Exception { Directory directory = FSDirectory.open(path); // 创建一个 分词器 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_42); String queryString = "标题"; IndexReader indexReader = DirectoryReader.open(directory); // QueryParser queryParser = new QueryParser(Version.LUCENE_42, "title", // analyzer); // Query query = queryParser.parse(queryString); TermQuery termQuery = new TermQuery(new Term("title", queryString)); // 进行搜索 IndexSearcher searcher = new IndexSearcher(indexReader); System.out.println("search is :" + searcher == null); TopDocs topDocs = searcher.search(termQuery, 10); System.out.println("查询得到的总的记录数是:" + topDocs.totalHits); /* ScoreDoc[] scoreDocs = topDocs.scoreDocs; List<Article> list = new ArrayList<Article>(); for (int i = 0; i < scoreDocs.length; i++) { Article article = new Article(); ScoreDoc score = scoreDocs[i]; Document doc = searcher.doc(score.doc); article.setId(Integer.parseInt(doc.get("id"))); article.setTitle(doc.get("title")); article.setContent(doc.get("content")); list.add(article); } for (Article article : list) { System.out.println("-----------> id :" + article.getId()); System.out.println("title :" + article.getTitle()); System.out.println("content :" + article.getContent()); } */ } } 控制台的结果是:false
我告诉你什么问题。
你建立索引的使用用了StandardAnalyzer的分词器,该分词器会把汉子句子分成单字,而你搜索时使用的TermQuery termQuery = new TermQuery(new Term("title", queryString)); queryString为“标题”,而且还没有分词,因此你搜索不到任何结果。你应该用“标”或者”题“肯定能搜到。
而你注释掉的:
QueryParser queryParser = new QueryParser(Version.LUCENE_42, "title", analyzer); Query query = queryParser.parse(queryString);逻辑是正确的。他可以用“标题”应该能搜索到,或者你直接让queryString = “title:标题”试试。 ######把词库换成IKAnalyzer试试######
我告诉你什么问题。
你建立索引的使用用了StandardAnalyzer的分词器,该分词器会把汉子句子分成单字,而你搜索时使用的TermQuery termQuery = new TermQuery(new Term("title", queryString)); queryString为“标题”,而且还没有分词,因此你搜索不到任何结果。你应该用“标”或者”题“肯定能搜到。
而你注释掉的:
QueryParser queryParser = new QueryParser(Version.LUCENE_42, "title", analyzer); Query query = queryParser.parse(queryString);逻辑是正确的。他可以用“标题”应该能搜索到,或者你直接让queryString = “title:标题”试试。
恩 逻辑是对的!
找到原因了, 用 StringField 的构造方法 不会默认建立索引,改成了 TextField 的构造方法,然后用
QueryParser queryParser = new QueryParser(Version.LUCENE_42, "title", analyzer); Query query = queryParser.parse(queryString);
能够得到结果 ,谢谢大神的指点
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。