Lucene 4.x Spellcheck使用说明
Spellcheck是Lucene新版本的功能,在介绍spellcheck之前,我们需要弄清楚Spellcheck支持几种数据源。Spellcheck构造函数需要传入Dictionary接口:
package org.apache.lucene.search.spell;
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ import java.io.IOException; import org.apache.lucene.search.suggest.InputIterator; /**
* A simple interface representing a Dictionary. A Dictionary
* here is a list of entries, where every entry consists of
* term, weight and payload.
*
*/
public interface Dictionary { /**
* Returns an iterator over all the entries
* @return Iterator
*/
InputIterator getEntryIterator() throws IOException;
}
常用的Dictionary主要有以下几种,常用的主要有基于文本型的和基于lucene索引构建的:

下面是我测试用的一段代码,代码包括索引构建和索引查询:
package com.tianditu.com.search; import java.io.File;
import java.io.IOException; import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.spell.LuceneDictionary;
import org.apache.lucene.search.spell.SpellChecker;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.MMapDirectory;
import org.apache.lucene.util.Version; public class GlobalSuggest { //拼写检查构建的索引
private final String SPELL_CHECK_FOLDER = "c:\\spellcheck\\"; //根据已有的索引
private final String GLOBAL_PINYIN_SUGGEST = "O:\\searchwork_custom\\data_index\\pinyin2008\\"; //构建索引
public void testIndexPinyin2008() throws IOException{ long start = System.currentTimeMillis();
//北京吉威时代软件股份有限公司
//String indexDir ="O:\\searchwork_custom\\data_index\\GlobalIndex\\";
Directory direct = new MMapDirectory(new File(GLOBAL_PINYIN_SUGGEST)); LuceneDictionary ld = new LuceneDictionary(DirectoryReader.open(direct), "name"); ld.getEntryIterator(); Directory spd = FSDirectory.open(new File(SPELL_CHECK_FOLDER)); SpellChecker sc = new SpellChecker(spd);
//sc.in IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_30,null); //往spellcheck目录下写索引--------------
sc.indexDictionary(ld, iwc, true); sc.close(); long end = System.currentTimeMillis();
System.out.println("索引完毕,耗时:"+(end-start)+"ms");
} public void testIndex() throws IOException{
long start = System.currentTimeMillis();
//北京吉威时代软件股份有限公司
String indexDir ="O:\\searchwork_custom\\data_index\\GlobalIndex\\";
Directory direct = new MMapDirectory(new File(indexDir)); LuceneDictionary ld = new LuceneDictionary(DirectoryReader.open(direct), "name"); ld.getEntryIterator(); Directory spd = FSDirectory.open(new File(SPELL_CHECK_FOLDER)); SpellChecker sc = new SpellChecker(spd);
//sc.in IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_30,null); sc.indexDictionary(ld, iwc, true); sc.close(); long end = System.currentTimeMillis();
System.out.println("索引完毕,耗时:"+(end-start)+"ms");
} public void testSearch(String wd) throws IOException{ //构建Directory
Directory spd = FSDirectory.open(new File(SPELL_CHECK_FOLDER)); //实例化 spellcheck组件 SpellChecker sc = new SpellChecker(spd); //根据输入关键字 获得N条最相近的几率 第三个鄙视精确度 越大越匹配 安装实际需要调整
String[] suggests = sc.suggestSimilar(wd, 10,0.6f);
if(suggests!=null){
for(String word:suggests){
System.out.println("Dou you mean:"+word);
}
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException { GlobalSuggest spellcheck = new GlobalSuggest();
//spellcheck.testIndexPinyin2008();
spellcheck.testSearch("beijing京鸭"); //spellcheck.testSearch("beijng"); } }
其中索引构建处代码:
//构建索引
public void testIndexPinyin2008() throws IOException{ long start = System.currentTimeMillis();
//北京吉威时代软件股份有限公司
//String indexDir ="O:\\searchwork_custom\\data_index\\GlobalIndex\\";
Directory direct = new MMapDirectory(new File(GLOBAL_PINYIN_SUGGEST)); LuceneDictionary ld = new LuceneDictionary(DirectoryReader.open(direct), "name"); ld.getEntryIterator(); Directory spd = FSDirectory.open(new File(SPELL_CHECK_FOLDER)); SpellChecker sc = new SpellChecker(spd);
//sc.in IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_30,null); //往spellcheck目录下写索引--------------
sc.indexDictionary(ld, iwc, true); sc.close(); long end = System.currentTimeMillis();
System.out.println("索引完毕,耗时:"+(end-start)+"ms");
}
此处代码,就是根据已有的索引来构建Spellcheck所需的索引。
Spellcheck查询索引代码片段如下:
//构建Directory
Directory spd = FSDirectory.open(new File(SPELL_CHECK_FOLDER)); //实例化 spellcheck组件 SpellChecker sc = new SpellChecker(spd); //根据输入关键字 获得N条最相近的几率 第三个鄙视精确度 越大越匹配 安装实际需要调整
String[] suggests = sc.suggestSimilar(wd, 10,0.6f);
if(suggests!=null){
for(String word:suggests){
System.out.println("Dou you mean:"+word);
}
}
相关算法:默认是 LevensteinDistance 。

查询样例:
1、查询汉字,有错别字情况:

2、查询拼音:

3、拼音汉字夹杂:

(备注:发现问题了,拼音和汉字夹杂的情况不行,如果想使用,需要进行某种处理。)
4、如果处理一长串汉字,中间夹杂错别字:

总结:看来spellcheck能力还是有限,如果需要用还可能改造。
Lucene 4.x Spellcheck使用说明的更多相关文章
- lucene字典实现原理
http://www.cnblogs.com/LBSer/p/4119841.html 1 lucene字典 使用lucene进行查询不可避免都会使用到其提供的字典功能,即根据给定的term找到该te ...
- lucene字典实现原理——FST
转自:http://www.cnblogs.com/LBSer/p/4119841.html 1 lucene字典 使用lucene进行查询不可避免都会使用到其提供的字典功能,即根据给定的term找到 ...
- Elasticsearch .Net Client NEST使用说明 2.x
Elasticsearch .net client NEST使用说明 2.x Elasticsearch.Net与NEST是Elasticsearch为C#提供的一套客户端驱动,方便C#调用Elast ...
- Lucene 02 - Lucene的入门程序(Java API的简单使用)
目录 1 准备环境 2 准备数据 3 创建工程 3.1 创建Maven Project(打包方式选jar即可) 3.2 配置pom.xml, 导入依赖 4 编写基础代码 4.1 编写图书POJO 4. ...
- Elasticsearch .net client NEST使用说明 2.x -更新版
Elasticsearch .net client NEST使用说明 目录: Elasticsearch .net client NEST 5.x 使用总结 elasticsearch_.net_cl ...
- solr5.3的spellcheck功能
1.增加schema.xml中的检查字段. <field name="title" type="text_cn" indexed="true&q ...
- solr特点四: SpellCheck(拼写检查)
接下来,我将介绍如何向应用程序添加 “您是不是要找……”(拼写检查). 提供拼写建议 Lucene 和 Solr 很久以前就开始提供拼写检查功能了,但直到添加了 SearchComponent架构之后 ...
- lucene字典实现原理(转)
原文:https://www.cnblogs.com/LBSer/p/4119841.html 1 lucene字典 使用lucene进行查询不可避免都会使用到其提供的字典功能,即根据给定的term找 ...
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...
随机推荐
- VS Code前端开发利器-常用快捷键
1.Ctrl+N ,新建文件,新建文件后需要先进行保存(Ctrl+S)并设置文件扩展名: 2.! +Tab,快速创建H5框架,文件扩展名必须为html: 3.Ctrl+Shift+P ,调出命令列表, ...
- fontIconPicker – 优雅的 jQuery 字体图标选择
jQuery fontIconPicker 是一个小的 jQuery 插件,它可以让你实现一个优雅的带有分类.搜索和分页功能的图标选择器.图标列表可手动从下拉列表框,图标数组或对象,或者从 Fonte ...
- 如何判断一个js对象是否一个DOM对象
我们在写js代码时有时需要判断某个对象是不是DOM对象,然后再进行后续的操作,这里我给出一种兼容各大浏览器,同时又算是比较稳妥的一种方法. 要判断一个对象是否DOM对象,首先想到的无非就是它是否具有D ...
- about this
var name="window name"; var obj={ name:"obj name", getNameFunc:function(){ //thi ...
- SharePoint 2013 通过审计获取文档下载次数
1.创建一个文档库,进入库设置,找到”Information management policy settings”,点进去,如下图: 2.分别设置”Document”.”Folder”两个,如下图: ...
- html5学习笔记:canvas
1.什么是canvas? 可以绘制图形的标签.一般用javascript来绘制. 2.创建一个画布 <!DOCTYPE html> <html> <head> &l ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q49-Q51)
Question 49You are designing a SharePoint 2010 intranet site for a corporation. Your design must mee ...
- C语言堆栈入门——堆和栈的区别
来看一个网上很流行的经典例子: main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc& ...
- XMPP实现登陆注销功能
XMPP框架的下载与导入等问题请参照 —— XMPP框架的分析.导入及问题解决 DEMO ——XMPP即时通讯(已导入框架)密码:3a7n 这篇我们利用XMPP框架来实现一下登陆功能,先来介绍一下XM ...
- OC点语法和变量作用域
OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: #import <Foundation/Foundation.h> @interface Person : ...