Field域属性分类 添加文档的时候,我们文档当中包含多个域,那么域的类型是我们自定义的,上个案例使用的TextField域,那么这个域他会自动分词,然后存储 我们要根据数据类型和数据的用途合理的选择合适的域 Field类: StringField(fieldName,fieldValue,Stroe.YES/NO) 存储的数据类型为字符串,包含索引,是否存储根据Stroe定义,不会经过分析器 StroeField(fieldName,fieldValue) 支持多种数据类型,不分析,不建立索引,默认保存到索引库当中 LongPoint(name,value) 会进行分析,会创建索引,但是不会保存到索引库当中 TextField(fieldName,fieldValue,Stroe.YES/NO) 会分析,会创建索引,是否保存取决Stroe 索引添加 @Test public void createDocument() throws IOException { //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\\Users\\FLC\\Desktop\\授课内容\\授课资料\\Y2170\\Luncen\\Index").toPath()), new IndexWriterConfig(new IKAnalyzer())); //创建一个文档对象 Document document=new Document(); document.add(new TextField("fieldName","hehe.txt", Field.Store.YES)); document.add(new StoredField("fieldPath","c://hehe.txt")); document.add(new LongPoint("fieldSize",123)); document.add(new StoredField("fieldSize",123)); document.add(new TextField("fieldContent","ojdbc14和ikanalyzer的maven找不到的解决办法,手动发布oJdbc14到maven仓库,手动发布ikanalyzer到maven,同时本教程适用于所有jar包发布 下载 IKAnalyzer结合Lucene使用和单独使用例子 简单性能测试 11-26 阅读数 1890 IKAnalyzer是一个开源基于JAVA语言的 .", Field.Store.YES)); //创建索引,将文档添加到索引库当中 indexWriter.addDocument(document); //关闭 indexWriter.close(); } 索引修改:原理-先删除在添加 /** * 索引修改,修改fieldName域中关键词匹配到全文检索的文档 * @throws IOException */ @Test public void updateDocument() throws IOException { //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\\Users\\FLC\\Desktop\\授课内容\\授课资料\\Y2170\\Luncen\\Index").toPath()), new IndexWriterConfig(new IKAnalyzer()));
//创建文档 Document document=new Document(); document.add(new TextField("fieldName","new.txt", Field.Store.YES)); document.add(new StoredField("fieldPath","c://new.txt")); document.add(new LongPoint("fieldSize",456)); document.add(new StoredField("fieldSize",456)); document.add(new TextField("fieldContent","修改fieldName为全文检索的文档,进行文档替换,先删除掉fieldName为全文检索的两个文档,再添加一个fileName为new的新文档", Field.Store.YES));
//修改 参数一为条件 参数二为修改的文档值 indexWriter.updateDocument(new Term("fieldName","全文检索"),document);
//关闭 indexWriter.close(); } 索引删除 2.4.1 删除全部:慎用 @Test public void deleteAllDocument() throws IOException { //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\\Users\\FLC\\Desktop\\授课内容\\授课资料\\Y2170\\Luncen\\Index").toPath()), new IndexWriterConfig(new IKAnalyzer()));
//删除索引 indexWriter.deleteAll(); //关闭 indexWriter.close(); } 2.4.2 根据域和关键词删除 /** * 根据域和关键词进行删除 * @throws IOException */ @Test public void deleteByFieldAndTermDocument() throws IOException { //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\\Users\\FLC\\Desktop\\授课内容\\授课资料\\Y2170\\Luncen\\Index").toPath()), new IndexWriterConfig(new IKAnalyzer()));
//定义一个删除条件,定义一个查询对象 Query query=new TermQuery(new Term("fieldName","全文检索")); //删除 indexWriter.deleteDocuments(query);
//关闭 indexWriter.close(); } 查询索引 Query子类: TermQuery:根据域和关键词进行搜索 /** * termQuery根据域和关键词进行搜索 * @throws IOException */ @Test public void termQuery() throws IOException { //创建查询条件 Query query=new TermQuery(new Term("fieldName","new")); //执行查询 TopDocs topDocs = indexSearcher.search(query, 10); System.out.println("返回的文档个数:" topDocs.totalHits);
//获取到文档集合 ScoreDoc [] scoreDocs=topDocs.scoreDocs; for (ScoreDoc doc:scoreDocs) { //获取到文档 Document document = indexSearcher.doc(doc.doc); //获取到文档域中数据 System.out.println("fieldName:" document.get("fieldName")); System.out.println("fieldPath:" document.get("fieldPath")); System.out.println("fieldSize:" document.get("fieldSize")); System.out.println("fieldContent:" document.get("fieldContent")); System.out.println("=============================================================="); } //关闭 indexReader.close(); } RangeQuery:范围搜索 前提:创建文档时保存范围 document.add(new LongPoint("fieldSize",456)); document.add(new StoredField("fieldSize",456)); /** * RangeQuery范围搜素 * @throws IOException */ @Test public void RangeQuery() throws IOException { //设置范围搜索的条件 参数一范围所在的域 Query query=LongPoint.newRangeQuery("fieldSize",0,50); //查询 TopDocs topDocs = indexSearcher.search(query, 10); System.out.println("返回的文档个数:" topDocs.totalHits);
//获取到文档集合 ScoreDoc [] scoreDocs=topDocs.scoreDocs; for (ScoreDoc doc:scoreDocs) { //获取到文档 Document document = indexSearcher.doc(doc.doc); //获取到文档域中数据 System.out.println("fieldName:" document.get("fieldName")); System.out.println("fieldPath:" document.get("fieldPath")); System.out.println("fieldSize:" document.get("fieldSize")); System.out.println("fieldContent:" document.get("fieldContent")); System.out.println("=============================================================="); }
//关闭 indexReader.close(); } QueryParser:匹配一行数据,这一行数据会自动进行分词 查询:Lucene是一个开源的基于Java的搜索库 Lucene 一个 开源 基于...... 使用方案: 1.导入依赖,如果当前没有QueryParser依赖则需要导入依赖 <!-- https:///artifact/org.apache.lucene/lucene-queryparser --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-queryparser</artifactId> <version>7.4.0</version> </dependency> 2.测试编码: /** * queryparser搜素,会将搜索条件分词 * @throws IOException */ @Test public void queryparser() throws IOException, ParseException { //创建一个QueryParser对象 参数一:查询的域 参数二:使用哪种分析器 QueryParser parser=new QueryParser("fieldContent",new IKAnalyzer()); //设置匹配的数据条件 Query query = parser.parse("Lucene是一个开源的基于Java的搜索库"); //查询 TopDocs topDocs = indexSearcher.search(query, 10); System.out.println("返回的文档个数:" topDocs.totalHits);
//获取到文档集合 ScoreDoc [] scoreDocs=topDocs.scoreDocs; for (ScoreDoc doc:scoreDocs) { //获取到文档 Document document = indexSearcher.doc(doc.doc); //获取到文档域中数据 System.out.println("fieldName:" document.get("fieldName")); System.out.println("fieldPath:" document.get("fieldPath")); System.out.println("fieldSize:" document.get("fieldSize")); System.out.println("fieldContent:" document.get("fieldContent")); System.out.println("=============================================================="); }
//关闭 indexReader.close();
来源:https://www./content-4-640801.html
|