一、分词器

  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. 百度Java研发面经100题 总结

    1. 单例模式常见的应用场景分析. 在23种设计模式中,单例模式排行老大.虽然理解简单,但是对于应用场景.你真正的熟悉么?使用单例,是由于没必要每个请求都新建一个对象,这样既浪费CPU又浪费内存:之所 ...

  2. PHP中使用redis执行lua脚本示例

    摸索了一下在PHP中如何使用redis执行lua脚本,写了一个脚本如下,供以后参考 <?php $redis = new Redis(); #实例化redis类 $redis->conne ...

  3. Python自动化测试工具Splinter简介和使用实例

    Splinter 快速介绍 官方网站:http://splinter.cobrateam.info/ 官方介绍: Splinter is an open source tool for testing ...

  4. java集合-Iterator迭代

    我们常常使用 JDK 提供的迭代接口进行 Java 集合的迭代. Iterator iterator = list.iterator(); while(iterator.hasNext()){ Str ...

  5. jQuery Label Better – 友好的表单输入框提示插件

    jQuery Label Better 帮助你标记您的表单输入域,带有美丽的动画效果而且不占用空间.这个插件的独特之处在于所有你需要做的就是添加一个占位符文本,只有当用户需要它的时候才显示标签. 您可 ...

  6. border-radius如何兼容IE

    目前而言firefox,opera,chrome等主流浏览器都已经支持border-radius属性,唯独IE8以及之前. 解决办法就是在用的border-radius属性的后面加上:behavior ...

  7. requirejs:让人迷惑的路径解析

    接触过requirejs的童鞋可能都知道,无论是通过define来定义模块,还是通过require来加载模块,模块依赖声明都是很重要的一步.而其中涉及到的模块路径解析,对于新手来说,有的时候会让人觉得 ...

  8. go语言 安装版 Windows7安装截图

    这个比较简单的 一路next. 查看:解压版安装go. //http://www.cnblogs.com/osfipin/

  9. Atitit.提升电子商务安全性 在线充值功能安全方面的设计

    Atitit.提升电子商务安全性 在线充值功能安全方面的设计 1. 防止dataservcie对充值订单表的直接改写,只能通过api,不能通过sql1 1.1. Order_id的安全取值,注入检测1 ...

  10. 编译安装mysql(Ubuntu10 64位)

    选用较好的编译器和较好的编译器选项,这样应用可提高性能10-30%,这个对大多数程序都非常重要 Mysql的编译,不同的版本具体的配置方式是有差别的 旧版的配置形式参考 这个形式主要是使用config ...