首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用lucene搜索

如何使用lucene搜索
EN

Stack Overflow用户
提问于 2016-04-05 06:05:13
回答 1查看 117关注 0票数 0

我想找到这个词"且试天下“且试天下是一个中文单词。所以关键是"且试天下“

但是当我搜索时,结果包含了三个这样的文档。

且试天下

共从容

梦之无游天下录

实际上,我只想得到第一个result.only,第一个和key.the相同,第二个和第三个只是在键中包含一些单词。

这是我的代码,我使用Lucene5.5

代码语言:javascript
运行
复制
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++);
        }
    }

下面是构建索引的代码

代码语言:javascript
运行
复制
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();
    }
EN

Stack Overflow用户

回答已采纳

发布于 2016-04-05 16:35:53

分析器的目的是将字符串拆分成令牌。SmartChineseAnalyzer将"且试天下“分为”且“,”试“和"天下",就像StandardAnalyzer将”谁将世界“拆分为”谁“、”获取“和”世界“一样。

如果您想作为短语进行搜索,您的查询应该引用:qp.parse("\"且试天下\"");

如果不希望对字段进行分析,请将其索引为StringField (或使用KeywordAnalyzer)。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36418334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档