一、分词器

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

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

  相关分词器示例如下:

 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分词器与搜索的更多相关文章

  1. Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...

  2. Lucene系列三:Lucene分词器详解、实现自己的一个分词器

    一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ...

  3. lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3

    前言: 前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作).如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这 ...

  4. lucene 分词器

    分词器 作用:切分关键词的. 在什么地方使用到了:在建立索引和搜索时. 原文:An IndexWriter creates and maintains an index. 1,切分: An Index ...

  5. lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter

    分词器的核心类: Analyzer:分词器 TokenStream: 分词器做优点理之后得到的一个流.这个流中存储了分词的各种信息,能够通过TokenStream有效的获取到分词单元. 下面是把文件流 ...

  6. 学习笔记(三)--Lucene分词器详解

    Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...

  7. Lucene分词器

    Lucene分析器的基类为Analyzer,Analyzer包含两个核心组件:Tokenizer和 TokenFilter.自定义分析器必须实现Analyzer类的抽象方法createComponen ...

  8. Lucene.net(4.8.0)+PanGu分词器问题记录一:分词器Analyzer的构造和内部成员ReuseStategy

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  9. Lucene 03 - 什么是分词器 + 使用IK中文分词器

    目录 1 分词器概述 1.1 分词器简介 1.2 分词器的使用 1.3 中文分词器 1.3.1 中文分词器简介 1.3.2 Lucene提供的中文分词器 1.3.3 第三方中文分词器 2 IK分词器的 ...

随机推荐

  1. 展示 Popup 的使用方法

    源码下载:[原创]展示Popup的使用方法.zip

  2. SQL内部拼接执行SQL语句时,实现变量参数化

    exec sp_ExecuteSql执行的SQL语句拼接起是比较麻烦,如果关联的表多拼接过程是很容易出错的,下面这方法非常的好用,而且简单直观 if exists(select * from syso ...

  3. 项目总结笔记系列 Social Hub KT Session1

    项目后台访问地址: URL:http://socialhub-itg-app.itcs.hp.com/data_feed_service/main.jsp 或者URL:http://c0048925. ...

  4. 泛函编程(31)-泛函IO:Free Monad-Running free

    在上节我们介绍了Free Monad的基本情况.可以说Free Monad又是一个以数据结构替换程序堆栈的实例.实际上Free Monad的功能绝对不止如此,以heap换stack必须成为Free M ...

  5. Headroom.js – 快速响应用户的页面滚动操作

    Headroom.js 是一个轻量级,高性能的JS插件(无依赖性!),允许你响应用户的滚动行为.Headroom.js 使您能够在适当的时候把元素融入视图,而其它时候让内容成为焦点.Headroom. ...

  6. css引入方式优先级以及不同选择器的优先级区别

    我们都知道css有3种基本设置方式即 1.行内也叫嵌入式 例如: <div style='background:red'></div> 2.内联式,在html文件中用style ...

  7. CSS3 学习笔记

    border-radius 圆角是做网页永远绕不过的话题,以前基本是通过背景图片做的,有了 CSS3 以后通过属性就 能够搞定,我们可以通过 border-radius 设置元素的圆角半径. bord ...

  8. 好文要顶之 --- 简单粗暴地理解 JavaScript 原型链

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  9. abap 字符串处理

    1).SHIFT:截断字符串 SHIFT {c} [BY {n} PLACES] [{mode}].:      作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则 ...

  10. UIView中的坐标转换

    在使用 UITableViewCell 的frame属性获取origin得到的坐标是不变的. 也就是说如果UITableView初始化完毕后,每个cell的坐标是固定的,x不变,y 随index递增的 ...