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分词器的 ...
随机推荐
- Mysql调试存储过程最简单的方法
以前同事告诉我用临时表插入变量数据来查看,但是这种方法过于麻烦,而且Mysql没有比较好的调试存储过程的工具.今天google了下发现可以用select + 变量名的方法来调试...真是让我汗颜啊. ...
- mysql本地可以访问 网络不能访问
远程登陆数据库的时候出现了下面出错信息: ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.xxx', 经过今天下午的 ...
- Java检测对象是否相等
关系运算符==和!=也适用于所有对象,但它们的含义通常会使初涉Java 领域的人找不到北.下面是一个例子: public class Equivalence { public static void ...
- Perfect Scrollbar – 完美的 jQuery 滚动条插件
Perfect Scrollbar 是一个很小的,但完美的 jQuery 滚动插件.滚动条不会影响原来的设计布局,滚动条的设计是完全可定制的.你可以改变几乎所有的 CSS 样式的滚动条,滚动条设计对脚 ...
- 将数据导入PostGIS
#!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess # database options db_schema = " ...
- Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer
Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...
- Autodesk的照片建模云服务—Autodesk ReCap 360 photo
现实捕捉技术方兴未艾,简单的讲现实捕捉技术就是把现实中的现状信息数字化到计算机中以便做进一步的处理.对于不同的应用目的会有不同的捕捉设备,工程或传媒娱乐行业中经常用到的肯定就是三维模型了.那如何得到三 ...
- 开发Android系统内置应用小记
Android系统内置应用可以使用更多的API.更高的权限,与开发普通应用最大的差别在于编译,内置应用编译需要用到Android.mk文件.下面是我在开发过程中的一些小记. 1.在AndroidMai ...
- swift 中手势的使用
swift 中手势的使用 /**点击手势*/ func tapGestureDemo() { //建立手势识别器 let gesture = UITapGestureRecognizer(target ...
- android studio我的习惯操作
一.修改字体 点击左上角File选择settings....进入界面选择Editor-->Colors&Fonts-->Font点击界面中Save As...在对话框中输入名字点击 ...