lucene 4.2 入门的 简单 问题, 求大神们帮忙解决下吧

唐小_兵 发布于 2013/04/15 17:44
阅读 2K+
收藏 1

我把一个对象的所有属性放入一个索引库  , 在然后尝试从里面读取数据 出来 , 但是 读取得到的记录数为 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
查询得到的总的记录数是:0
 
加载中
0
震秦
震秦

我告诉你什么问题。

你建立索引的使用用了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:标题”试试。

0
戴威
戴威
把词库换成IKAnalyzer试试
0
唐小_兵

引用来自“震秦”的答案

我告诉你什么问题。

你建立索引的使用用了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);
能够得到结果 ,谢谢大神的指点

0
唐小_兵
还有我想问下 , 分词 会不会 存到磁盘 或者是内存 , 索引是需要存到磁盘的吧?
0
dreamers
dreamers
StringField  默认也会建立索引的呀。
0
k
keloerry
StringField会被索引但不会做分词处理,整个字符串作为一个token,见https://lucene.apache.org/core/4_7_0/core/org/apache/lucene/document/StringField.html
0
coding云
coding云
原来如此,难怪我测试的时候,只有textField索引后,能查到数据。。。
返回顶部
顶部