lucene分词器与搜索
一、分词器
lucene针对不同的语言和虚伪提供了许多分词器,我们可以针对应用的不同的需求使用不同的分词器进行分词。我们需要注意的是在创建索引时使用的分词器与搜索时使用的分词器要保持一致。否则搜索的结果就不是我们期望的结果。lucene提供的常规分词器如下:
相关分词器示例如下:
package com.test.lucene; import java.io.IOException;
import java.io.StringReader; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.core.StopAnalyzer;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; /**
* 分词器
*/
public class AnalyzerStudy { /**
* 分词并打印分词结果
*
* @param analyzer
* 分词器种类
* @param content
* 需要分词的内容
*/
private static void print(Analyzer analyzer, String content) {
StringReader reader = new StringReader(content);
try {
TokenStream tokenStream = analyzer.tokenStream("", reader);
tokenStream.reset();
CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class);
System.out.println("分词技术" + analyzer.getClass());
while (tokenStream.incrementToken()) {
System.out.print(term.toString() + "|");
}
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
String content = "上海广州, lucene 软件 开发";
Analyzer analyzer = null;
// 标准分词
analyzer = new StandardAnalyzer();
print(analyzer, content); // 空格分词
analyzer = new WhitespaceAnalyzer();
print(analyzer, content); // 简单分词
analyzer = new SimpleAnalyzer();
print(analyzer, content); // 二分法分词
analyzer = new CJKAnalyzer();
print(analyzer, content); // 关键字分词
analyzer = new KeywordAnalyzer();
print(analyzer, content); // 被忽略词分词
analyzer = new StopAnalyzer();
print(analyzer, content); // 中文分词
analyzer = new SmartChineseAnalyzer();
print(analyzer, content);
} }
运行结果如下:

二、搜索条件
在有些应用场景中,我们需要在搜索的时候,使用多个条件进行查询。此时我们可以使用lucene提供的搜索条件进行搜索。如对多个域进行查询、前缀查询、通配符查询等。
相关示查询例如下:
package com.test.lucene; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery; /**
* 查询条件
*/
public class QueryStudy {
public static void main(String[] args) {
// 搜索关键词
String keyword = "上海";
// 搜索域名
String field = "name";
// 搜索多个域的域名数组
String[] fields = { "name", "content" };
// Query 创建过程中的分词技术
Analyzer analyzer = new StandardAnalyzer();
Query query = null;
// 对单个域创建查询语句
QueryParser parser = new QueryParser(field, analyzer);
try {
query = parser.parse(keyword);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(QueryParser.class + " " + query.toString()); // 对多个域创建查询语句
MultiFieldQueryParser parser2 = new MultiFieldQueryParser(fields, analyzer);
try {
query = parser2.parse(keyword);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(MultiFieldQueryParser.class + " " + query.toString()); // 词条查询语句
query = new TermQuery(new Term(field, keyword));
System.out.println(TermQuery.class + " " + query.toString()); // 前缀查询语句
query = new PrefixQuery(new Term(field, keyword));
System.out.println(PrefixQuery.class + " " + query.toString()); // 多余查询语句
PhraseQuery query2 = new PhraseQuery();
// 设置短语之间的最大距离
query2.add(new Term(field, "上海"));
query2.add(new Term(field, "lucene开发"));
System.out.println(PhraseQuery.class + " " + query2.toString()); // 通配符查询语句,Lucene中有 * ? 两个通配符, *表示任意多个字符,?表示一个任意字符
query = TermRangeQuery.newStringRange(field, "abc", "azz", false, false);
System.out.println(TermRangeQuery.class + " " + query.toString()); // 布尔查询
BooleanQuery query3 = new BooleanQuery();
query3.add(new TermQuery(new Term(field, "上海")), Occur.SHOULD);
query3.add(new TermQuery(new Term(field, "lucene")), Occur.SHOULD);
query3.add(new TermQuery(new Term(field, "案例")), Occur.MUST_NOT);
System.out.println(BooleanQuery.class + " " + query3.toString());
}
}
运行结果如下:

lucene分词器与搜索的更多相关文章
- Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息
Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...
- Lucene系列三:Lucene分词器详解、实现自己的一个分词器
一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ...
- lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3
前言: 前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作).如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这 ...
- lucene 分词器
分词器 作用:切分关键词的. 在什么地方使用到了:在建立索引和搜索时. 原文:An IndexWriter creates and maintains an index. 1,切分: An Index ...
- lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter
分词器的核心类: Analyzer:分词器 TokenStream: 分词器做优点理之后得到的一个流.这个流中存储了分词的各种信息,能够通过TokenStream有效的获取到分词单元. 下面是把文件流 ...
- 学习笔记(三)--Lucene分词器详解
Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...
- Lucene分词器
Lucene分析器的基类为Analyzer,Analyzer包含两个核心组件:Tokenizer和 TokenFilter.自定义分析器必须实现Analyzer类的抽象方法createComponen ...
- Lucene.net(4.8.0)+PanGu分词器问题记录一:分词器Analyzer的构造和内部成员ReuseStategy
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
- Lucene 03 - 什么是分词器 + 使用IK中文分词器
目录 1 分词器概述 1.1 分词器简介 1.2 分词器的使用 1.3 中文分词器 1.3.1 中文分词器简介 1.3.2 Lucene提供的中文分词器 1.3.3 第三方中文分词器 2 IK分词器的 ...
随机推荐
- 【C语言学习趣事】_32_平胸的尴尬,嫁不出去的姑娘
为什么写这篇文章呢? 为什么要弄这么个题目呢? 首先解释为什么用这个题目.这一切都要从那天在QQ群中的讨论说起,那天在群中,一个哥们问了一个关于(void)0 的问题.然后大家说到了 (void)0和 ...
- HDU 4293---Groups(区间DP)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4293 Problem Description After the regional con ...
- Muzli – 所有你需要的设计灵感都在这
曾几何时,三个家伙一起工作,他们分享各种令人振奋的资源链接.然后,其中一个人有一个想法.一个绝妙的主意,是否可以有一种方式来与他人分享这些链接?因此, Muzli 诞生了.所有你需要的设计灵感这里都有 ...
- CSS中!important的作用
提升指定样式规则的应用优先权. IE6及以下浏览器有个比较显式的支持问题存在,!important在同一条规则集里不生效.请看下述代码: 示例代码: div { color: #f00 !import ...
- 安卓 9.png 图片的制作
安卓的九宫格png图片可以自定义拉伸的区域,所以可以很方便的适应不同宽度高度的设备. 9.png格式是很纯正的png格式,与普通的png不同的是9.png格式的图片最外围有一圈1像素的透明区域,或者说 ...
- js删除数组中的'NaN'
js中的NaN不和任何值相等,包括自身. 所以可以使用x!=x来判断x是否是NaN,当且仅当x为NaN时,表达式的结果为true. NaN != NaN //true 可以依此删除数组中的'NaN'. ...
- 为 MDS 修改 SharePoint 2013组件
了解如何修改 SharePoint 项目中的组件以在 SharePoint 2013 中利用最少下载策略(MDS). 本文内容 为何修改 SharePoint 组件? 母版页 ASP.NET 页面 ...
- Dotfuscator混淆加密
混淆加密 1. 需要安装Dotfuscator软件 2. 安装好后打开软件,找到编译好的DLL文件 3. 打开[setting]设置属性,如下图: 把 Disable String Encryptio ...
- [javascript svg fill stroke stroke-width x1 y1 x2 y2 line stroke-opacity fill-opacity 属性讲解] svg fill stroke stroke-width stroke-opacity fill-opacity line绘制线条属性讲解
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- 不直接登录SharePoint服务器,通过远程直接部署WSP解决方案包
在这之前不得不说一下Sysinternals,他最初是一个网站,网站上会经常发布一些有用的系统扩展工具,之后运营这个网站的公司被微软收购.像非常著名的Procmon,AutoRuns.Process ...