日期:2014-05-17  浏览次数:20701 次

IKAnalyzer分词器的问题
程序代码如下:
public class IKIndexAndSearch{
public static void main(String[] args) throws Exception{
String text = "国内";
String text1 = "故宫,国内山水";
//实例化IKAnalyzer分词器
Analyzer analyzer = new IKAnalyzer(false);
//建立内存目录
Directory dir = new RAMDirectory();
//配置IndexWriterConfig
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_45,analyzer);
IndexWriter iwriter = new IndexWriter(dir,config);
//写入索引
Document doc = new Document();
doc.add(new StringField("ID","10000",Field.Store.YES));
doc.add(new TextField("text",text,Field.Store.YES));

Document doc1 = new Document();
doc1.add(new StringField("ID","10001",Field.Store.YES));
doc1.add(new TextField("text",text1,Field.Store.YES));

iwriter.addDocument(doc);
iwriter.addDocument(doc1);
iwriter.close();

//实例化搜索器
DirectoryReader ireader = DirectoryReader.open(dir);
IndexSearcher isearcher = new IndexSearcher(ireader);

//String keyword = "中文分词工具包";
//String keyword = "这是一个中文分词的例子";
String keyword = "国内山水";

//使用QueryParser查询分析器构造Query对象
QueryParser qp = new QueryParser(Version.LUCENE_45,"text",analyzer);
Query query = qp.parse(keyword);
System.out.println("QueryParser:"+query.toString());

//搜索相似度最高的5条记录
TopDocs topDocs = isearcher.search(query, 5);
System.out.println("命中:"+topDocs.totalHits);
//输出结果
ScoreDoc[] scoreDocs = topDocs.scoreDocs;

for(int i=0;i<topDocs.totalHits;i++){
Document targetDoc = isearcher.doc(scoreDocs[i].doc);
System.out.println("内容:"+targetDoc.toString());
}
ireader.close();
dir.close();
}
}
运行结果:
QueryParser:text:国内 text:山水
命中:2
内容:Document<stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<ID:10001> stored,indexed,tokenized<text:故宫,国内山水>>
内容:Document<stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<ID:10000> stored,indexed,tokenized<text:国内>>

请问为什么输入'国内山水',查出两条记录,把国内也查出来了,如何才能查出一条记录,谢谢
lucene

------解决方案--------------------
如果想用绝对的AND,可以把遍历所有terms, 然后把想要的term也就是关键词给找出来。
拿到这个term的 DocsAndPositionsEnum,然后自己实现一个简单的AND算法。