我想找到这个词"且试天下“且试天下是一个中文单词。所以关键是"且试天下“
但是当我搜索时,结果包含了三个这样的文档。
且试天下
且共从容
梦之无游天下录
实际上,我只想得到第一个result.only,第一个和key.the相同,第二个和第三个只是在键中包含一些单词。
这是我的代码,我使用Lucene5.5
public void doSearch() throws Exception {
String key = "且试天下";
Path path = FileSystems.getDefault().getPath("D:/Lucene/StoryExercise", "index");
Directory directory = new NIOFSDirectory(path);
IndexReader ir = DirectoryReader.open(directory);
IndexSearcher is = new IndexSearcher(ir);
Analyzer analyzer = new SmartChineseAnalyzer();
Builder builder = new BooleanQuery.Builder();
QueryParser qp = new ComplexPhraseQueryParser("filename", analyzer);
Query parse = qp.parse(key);
builder.add(new BooleanClause(parse, BooleanClause.Occur.MUST));
BooleanQuery build = builder.build();
TopDocs td = is.search(build, 100);
ScoreDoc[] docs = td.scoreDocs;
Document doc = null;
int i = 1;
for (ScoreDoc sd : docs) {
doc = is.doc(sd.doc);
System.out.println(doc.get("filename") + " HAS THE WORD : " + key + i++);
}
}
下面是构建索引的代码
public void doIndex() throws Exception {
Path path = FileSystems.getDefault().getPath("D:/Lucene/StoryExercise", "index");
Directory directory = new NIOFSDirectory(path);
Analyzer analyzer = new SmartChineseAnalyzer();
IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
IndexWriter iw = new IndexWriter(directory, iwc);
File filedir = new File("D:/Lucene/StoryExercise/data");
Document doc = null;
for (File file : filedir.listFiles()) {
doc = new Document();
doc.add(new TextField("path", file.getPath(), Field.Store.YES));
doc.add(new TextField("filename", file.getName(), Field.Store.YES));
doc.add(new TextField("content", new FileReader(file)));
iw.addDocument(doc);
}
iw.close();
}
发布于 2016-04-05 16:35:53
分析器的目的是将字符串拆分成令牌。SmartChineseAnalyzer
将"且试天下“分为”且“,”试“和"天下",就像StandardAnalyzer
将”谁将世界“拆分为”谁“、”获取“和”世界“一样。
如果您想作为短语进行搜索,您的查询应该引用:qp.parse("\"且试天下\"");
如果不希望对字段进行分析,请将其索引为StringField
(或使用KeywordAnalyzer
)。
https://stackoverflow.com/questions/36418334
复制相似问题