lucene分词器与搜索

简介: 一、分词器   lucene针对不同的语言和虚伪提供了许多分词器,我们可以针对应用的不同的需求使用不同的分词器进行分词。我们需要注意的是在创建索引时使用的分词器与搜索时使用的分词器要保持一致。否则搜索的结果就不是我们期望的结果。

一、分词器

  lucene针对不同的语言和虚伪提供了许多分词器,我们可以针对应用的不同的需求使用不同的分词器进行分词。我们需要注意的是在创建索引时使用的分词器与搜索时使用的分词器要保持一致。否则搜索的结果就不是我们期望的结果。lucene提供的常规分词器如下:

•StandardAnalyzer 标准分词器
•IKAnalyzer 基于Lucene的第三方中文分词技术
•WhitespaceAnalyzer 空格分词器
•SimpleAnalyzer 简单分词器
•CJKAnalyzer 二分法分词器
•KeywordAnalyzer 关键词分词器
•StopAnalyzer 被忽略词分词器
•FrenchAnalyzer 法国语言分词
•GermanAnalyzer 德国语言分词
•GreekAnalyzer 希腊语言分词
•RussianAnalyzer 俄罗斯语言分词

   相关分词器示例如下:

 1 package com.test.lucene;
 2 
 3 import java.io.IOException;
 4 import java.io.StringReader;
 5 
 6 import org.apache.lucene.analysis.Analyzer;
 7 import org.apache.lucene.analysis.TokenStream;
 8 import org.apache.lucene.analysis.cjk.CJKAnalyzer;
 9 import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
10 import org.apache.lucene.analysis.core.KeywordAnalyzer;
11 import org.apache.lucene.analysis.core.SimpleAnalyzer;
12 import org.apache.lucene.analysis.core.StopAnalyzer;
13 import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
14 import org.apache.lucene.analysis.standard.StandardAnalyzer;
15 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
16 
17 /**
18  * 分词器
19  */
20 public class AnalyzerStudy {
21 
22     /**
23      * 分词并打印分词结果
24      * 
25      * @param analyzer
26      *            分词器种类
27      * @param content
28      *            需要分词的内容
29      */
30     private static void print(Analyzer analyzer, String content) {
31         StringReader reader = new StringReader(content);
32         try {
33             TokenStream tokenStream = analyzer.tokenStream("", reader);
34             tokenStream.reset();
35             CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class);
36             System.out.println("分词技术" + analyzer.getClass());
37             while (tokenStream.incrementToken()) {
38                 System.out.print(term.toString() + "|");
39             }
40             System.out.println();
41         } catch (IOException e) {
42             e.printStackTrace();
43         }
44     }
45 
46     public static void main(String[] args) {
47         String content = "上海广州, lucene 软件 开发";
48         Analyzer analyzer = null;
49         // 标准分词
50         analyzer = new StandardAnalyzer();
51         print(analyzer, content);
52 
53         // 空格分词
54         analyzer = new WhitespaceAnalyzer();
55         print(analyzer, content);
56 
57         // 简单分词
58         analyzer = new SimpleAnalyzer();
59         print(analyzer, content);
60 
61         // 二分法分词
62         analyzer = new CJKAnalyzer();
63         print(analyzer, content);
64 
65         // 关键字分词
66         analyzer = new KeywordAnalyzer();
67         print(analyzer, content);
68 
69         // 被忽略词分词
70         analyzer = new StopAnalyzer();
71         print(analyzer, content);
72 
73         // 中文分词
74         analyzer = new SmartChineseAnalyzer();
75         print(analyzer, content);
76     }
77 
78 }

  运行结果如下:

 二、搜索条件

  在有些应用场景中,我们需要在搜索的时候,使用多个条件进行查询。此时我们可以使用lucene提供的搜索条件进行搜索。如对多个域进行查询、前缀查询、通配符查询等。

  相关示查询例如下:

 

 1 package com.test.lucene;
 2 
 3 import org.apache.lucene.analysis.Analyzer;
 4 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 5 import org.apache.lucene.index.Term;
 6 import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
 7 import org.apache.lucene.queryparser.classic.ParseException;
 8 import org.apache.lucene.queryparser.classic.QueryParser;
 9 import org.apache.lucene.search.BooleanClause.Occur;
10 import org.apache.lucene.search.BooleanQuery;
11 import org.apache.lucene.search.PhraseQuery;
12 import org.apache.lucene.search.PrefixQuery;
13 import org.apache.lucene.search.Query;
14 import org.apache.lucene.search.TermQuery;
15 import org.apache.lucene.search.TermRangeQuery;
16 
17 /**
18  * 查询条件
19  */
20 public class QueryStudy {
21     public static void main(String[] args) {
22         // 搜索关键词
23         String keyword = "上海";
24         // 搜索域名
25         String field = "name";
26         // 搜索多个域的域名数组
27         String[] fields = { "name", "content" };
28         // Query 创建过程中的分词技术
29         Analyzer analyzer = new StandardAnalyzer();
30         Query query = null;
31         // 对单个域创建查询语句
32         QueryParser parser = new QueryParser(field, analyzer);
33         try {
34             query = parser.parse(keyword);
35         } catch (ParseException e) {
36             e.printStackTrace();
37         }
38         System.out.println(QueryParser.class + " " + query.toString());
39 
40         // 对多个域创建查询语句
41         MultiFieldQueryParser parser2 = new MultiFieldQueryParser(fields, analyzer);
42         try {
43             query = parser2.parse(keyword);
44         } catch (ParseException e) {
45             e.printStackTrace();
46         }
47         System.out.println(MultiFieldQueryParser.class + " " + query.toString());
48 
49         // 词条查询语句
50         query = new TermQuery(new Term(field, keyword));
51         System.out.println(TermQuery.class + " " + query.toString());
52 
53         // 前缀查询语句
54         query = new PrefixQuery(new Term(field, keyword));
55         System.out.println(PrefixQuery.class + " " + query.toString());
56 
57         // 多余查询语句
58         PhraseQuery query2 = new PhraseQuery();
59         // 设置短语之间的最大距离
60         query2.add(new Term(field, "上海"));
61         query2.add(new Term(field, "lucene开发"));
62         System.out.println(PhraseQuery.class + " " + query2.toString());
63 
64         // 通配符查询语句,Lucene中有 * ? 两个通配符, *表示任意多个字符,?表示一个任意字符
65         query = TermRangeQuery.newStringRange(field, "abc", "azz", false, false);
66         System.out.println(TermRangeQuery.class + " " + query.toString());
67 
68         // 布尔查询
69         BooleanQuery query3 = new BooleanQuery();
70         query3.add(new TermQuery(new Term(field, "上海")), Occur.SHOULD);
71         query3.add(new TermQuery(new Term(field, "lucene")), Occur.SHOULD);
72         query3.add(new TermQuery(new Term(field, "案例")), Occur.MUST_NOT);
73         System.out.println(BooleanQuery.class + " " + query3.toString());
74     }
75 }

  运行结果如下:

目录
相关文章
|
算法 数据处理 计算机视觉
【MATLAB 】 MODWT 信号分解+希尔伯特黄变换+边际谱算法
【MATLAB 】 MODWT 信号分解+希尔伯特黄变换+边际谱算法
532 0
|
Java Maven
震惊!idea专业版如何配置maven国内源手把手教学
文章提供了如何在IDEA专业版中配置Maven使用国内源(如阿里云)的详细步骤,以加快依赖下载速度,并解释了配置国内源的原因。
3171 0
震惊!idea专业版如何配置maven国内源手把手教学
|
存储 机器学习/深度学习 人工智能
未来已来:AI技术的最新趋势与前沿探索
【7月更文第20天】在这个日新月异的时代,人工智能(AI)已经从科幻概念逐渐深入到我们日常生活的方方面面,其发展速度之快超乎想象。从基础的语音识别、图像分析到复杂的决策制定、自动驾驶,AI技术正以前所未有的力量推动着社会进步。本文将带您一同展望AI技术的未来发展方向,深入探讨量子计算、生物计算等新兴领域的前沿探索,以及它们如何重新定义AI的边界。
777 0
|
数据采集 机器学习/深度学习 数据可视化
数据挖掘实战:Python在金融数据分析中的应用案例
Python在金融数据分析中扮演关键角色,用于预测市场趋势和风险管理。本文通过案例展示了使用Python库(如pandas、numpy、matplotlib等)进行数据获取、清洗、分析和建立预测模型,例如计算苹果公司(AAPL)股票的简单移动平均线,以展示基本流程。此示例为更复杂的金融建模奠定了基础。【6月更文挑战第13天】
2890 3
|
API Swift Python
SwiftUI极简教程11:Path路径的使用
SwiftUI极简教程11:Path路径的使用
1122 0
SwiftUI极简教程11:Path路径的使用
|
存储
刷题之完全二叉树的权值和小字辈及根据后序和中序遍历输出先序遍历
刷题之完全二叉树的权值和小字辈及根据后序和中序遍历输出先序遍历
207 0
|
存储 弹性计算 关系型数据库
阿里云/腾讯云/UCloud/华为云服务器主机对比测试报告
在2020年初之际,国内专业的云资源选型服务平台CloudBest旗下监测实验室,针对业界4家主流的云服务提供商,包括阿里云、腾讯云、UCloud与华为云进行了横向评测。本次测试在尽量保证测试环境相同的情况下,提供客观公正的测试数据,从技术层面对云服务提供商提供的云主机产品进行性能(CPU、磁盘、网络等)与性价比评测。以下为CloudBest监测实验室详细测试报告:
阿里云/腾讯云/UCloud/华为云服务器主机对比测试报告
|
关系型数据库 MySQL Linux
redhat下安装mysql 5.6.20,解压zip包,查看已经安装过的mysql,卸载rpm安装包,安装mysql服务器端和客户端,修改mysql用户名,登陆mysql,启动关闭mysql
 1 将相关的mysql rpm包上传到redhat上 2  我的电脑是Redhat 6.*版本,所以这里使用上面一个 3  解压zip包 4  安装以下几个rpm MySQL-client-advanced-5.6.20-1.el6.x86_64.rpm MySQL-server-advanced-5.6.20-1.el6.x86_64.rpm
2171 0