我把一个对象的所有属性放入一个索引库 , 在然后尝试从里面读取数据 出来 , 但是 读取得到的记录数为 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);
能够得到结果 ,谢谢大神的指点