- 浏览: 755248 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
a offset: 26b offset: 24c offse ...
java jvm字节占用空间分析 -
ls0609:
语音实现在线听书http://blog.csdn.net/ls ...
Android 语音输入API使用 -
wangli61289:
http://viralpatel-net-tutorials ...
Android 语音输入API使用 -
zxjlwt:
学习了素人派http://surenpi.com
velocity宏加载顺序 -
tt5753:
谢啦........
Lucene的IndexWriter初始化时的LockObtainFailedException的解决方法
需要引入
<dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-highlighter</artifactId> <version>3.6.0</version> </dependency>
示例代码:
import java.io.File;
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.standard.StandardAnalyzer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.analysis.tokenattributes.OffsetAttribute; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.InvalidTokenOffsetsException; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class DocSearch { private static IndexSearcher isearcher = null; public static void search(String key) throws IOException, ParseException, InvalidTokenOffsetsException{ Directory directory = FSDirectory.open(new File("E:\\output\\lucence\\index")); // Now search the index: IndexReader ireader = IndexReader.open(directory); // read-only=true isearcher = new IndexSearcher(ireader); // Parse a simple query that searches for "text": Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT); // TokenStream tokenStream = analyzer.tokenStream("context", new StringReader("this is a quick gooobuy")); // OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class); // CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); // // while (tokenStream.incrementToken()) { // int startOffset = offsetAttribute.startOffset(); // int endOffset = offsetAttribute.endOffset(); // String term = charTermAttribute.toString(); // System.out.println(offsetAttribute.toString() + "\t" + term); // } QueryParser parser = new QueryParser(Version.LUCENE_CURRENT,"context", analyzer); Query query = parser.parse(key); ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs; Highlighter hl = new Highlighter(new QueryScorer(query)); System.out.println(query.toString()); // Iterate through the results: for (int i = 0; i < hits.length; i++) { Document hitDoc = isearcher.doc(hits[i].doc); TokenStream ts = analyzer.tokenStream("context", new StringReader(hitDoc.getValues("context")[0])); String frament = hl.getBestFragment(ts, hitDoc.getValues("context")[0]); System.out.println(frament); // System.out.println(hitDoc.getValues("id")[0] + "\t" + hitDoc.getValues("context")[0] + "\t" + hits[i].score); // Explanation explan = isearcher.explain(query, hits[i].doc); // System.out.println(explan); } } public static void main(String[] args) throws IOException, ParseException, InvalidTokenOffsetsException { search("旧水泥袋"); isearcher.close(); } }
索引建立和数据参考http://zhwj184.iteye.com/admin/blogs/1522709
输出结果:
context:旧 context:水 context:泥 context:袋 采购<B>旧</B>编织<B>袋</B>、<B>旧</B><B>水</B><B>泥</B><B>袋</B> <B>水</B><B>泥</B> 采购<B>水</B><B>泥</B>电阻 求购<B>水</B><B>泥</B>输送链条和提升机 1万5 潜<B>水</B>料啤酒手提包 手提<B>袋</B> 大量采购包装用的编织<B>袋</B>(新的<B>旧</B>的,有无商标皆可) 铁<B>泥</B> 铁灰 废<B>旧</B>砂轮 软陶<B>泥</B>,超轻粘土 <B>水</B>泵 手<B>袋</B> <B>水</B>锈石 上<B>水</B>石 吸<B>水</B>石 足浴<B>袋</B> 泡脚<B>袋</B> 异形<B>袋</B> 手提<B>袋</B>制<B>袋</B>机 回收库存废<B>旧</B>油墨油漆 回收库存<B>旧</B>油漆13463048572 求购废<B>旧</B>油漆油墨13463048572 求购库存<B>旧</B>化工树脂
highlighter类的分析
/** * Class used to markup highlighted terms found in the best sections of a * text, using configurable {@link Fragmenter}, {@link Scorer}, {@link Formatter}, * {@link Encoder} and tokenizers. */ public class Highlighter { public static final int DEFAULT_MAX_CHARS_TO_ANALYZE = 50*1024; private int maxDocCharsToAnalyze = DEFAULT_MAX_CHARS_TO_ANALYZE; private Formatter formatter; private Encoder encoder; private Fragmenter textFragmenter=new SimpleFragmenter(); private Scorer fragmentScorer=null; public Highlighter(Scorer fragmentScorer) { this(new SimpleHTMLFormatter(),fragmentScorer); } public Highlighter(Formatter formatter, Scorer fragmentScorer) { this(formatter,new DefaultEncoder(),fragmentScorer); } public Highlighter(Formatter formatter, Encoder encoder, Scorer fragmentScorer) { this.formatter = formatter; this.encoder = encoder; this.fragmentScorer = fragmentScorer; }
这里有两个扩展,formatter和encoder,formatter其实就是堆高亮部分的显示逻辑,比如默认是直接加<B></B>,encoder编码这里默认是不错任何处理,这里可以对输入的文本进行编码处理,
可以查看highlighter的encoder的一个默认实现
package org.apache.lucene.search.highlight; /** * Copyright 2005 The Apache Software Foundation * * Licensed 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. */ /** * Simple {@link Encoder} implementation to escape text for HTML output * */ public class SimpleHTMLEncoder implements Encoder { public SimpleHTMLEncoder() { } public String encodeText(String originalText) { return htmlEncode(originalText); } /** * Encode string into HTML */ public final static String htmlEncode(String plainText) { if (plainText == null || plainText.length() == 0) { return ""; } StringBuilder result = new StringBuilder(plainText.length()); for (int index=0; index<plainText.length(); index++) { char ch = plainText.charAt(index); switch (ch) { case '"': result.append("""); break; case '&': result.append("&"); break; case '<': result.append("<"); break; case '>': result.append(">"); break; default: if (ch < 128) { result.append(ch); } else { result.append("&#").append((int)ch).append(";"); } } } return result.toString(); } }
formatter的默认实现
package org.apache.lucene.search.highlight; /** * 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. */ /** * Simple {@link Formatter} implementation to highlight terms with a pre and * post tag. */ public class SimpleHTMLFormatter implements Formatter { private static final String DEFAULT_PRE_TAG = "<B>"; private static final String DEFAULT_POST_TAG = "</B>"; private String preTag; private String postTag; public SimpleHTMLFormatter(String preTag, String postTag) { this.preTag = preTag; this.postTag = postTag; } /** Default constructor uses HTML: <B> tags to markup terms. */ public SimpleHTMLFormatter() { this(DEFAULT_PRE_TAG, DEFAULT_POST_TAG); } /* (non-Javadoc) * @see org.apache.lucene.search.highlight.Formatter#highlightTerm(java.lang.String, org.apache.lucene.search.highlight.TokenGroup) */ public String highlightTerm(String originalText, TokenGroup tokenGroup) { if (tokenGroup.getTotalScore() <= 0) { return originalText; } // Allocate StringBuilder with the right number of characters from the // beginning, to avoid char[] allocations in the middle of appends. StringBuilder returnBuffer = new StringBuilder(preTag.length() + originalText.length() + postTag.length()); returnBuffer.append(preTag); returnBuffer.append(originalText); returnBuffer.append(postTag); return returnBuffer.toString(); } }
评论
1 楼
yuhe
2013-07-04
碰到一个很奇怪的问题,暂时没时间去想:
中文 高亮的时候,加上
Encoder encoder = new SimpleHTMLEncoder();
结果是unicode编码:
<span style='color:red;'>那些</span>
注释掉这段代码,结果是想要的
<span style='color:red;'>那些</span
没搞明白..............
中文 高亮的时候,加上
Encoder encoder = new SimpleHTMLEncoder();
结果是unicode编码:
<span style='color:red;'>那些</span>
注释掉这段代码,结果是想要的
<span style='color:red;'>那些</span
没搞明白..............
发表评论
-
对字符串进行验证之前先进行规范化
2013-09-17 23:18 13957对字符串进行验证之前先进行规范化 应用系统中经常对字 ... -
使用telnet连接到基于spring的应用上执行容器中的bean的任意方法
2013-08-08 09:17 1482使用telnet连接到基于spring的应用上执行容器中 ... -
jdk7和8的一些新特性介绍
2013-07-06 16:07 10114更多ppt内容请查看:htt ... -
Lucene的IndexWriter初始化时的LockObtainFailedException的解决方法
2013-06-28 21:35 11808原文链接: http://www.javaarch.net ... -
java对于接口和抽象类的代理实现,不需要有具体实现类
2013-06-12 09:50 2957原文链接:http://www.javaarch.net/j ... -
Excel2007格式分析和XML解析
2013-06-07 09:56 10746在物料清单采购中,用到excel上传文件解析功能,不 ... -
Java EE 7中对WebSocket 1.0的支持
2013-06-05 09:27 3846原文链接:http://www.javaarch.n ... -
java QRCode生成示例
2013-06-05 09:26 1516原文链接:http://www.javaarch.n ... -
Spring Security Logout
2013-06-03 00:05 2372原文地址:http://www.javaarch.net/ ... -
Spring Security Basic Authentication
2013-06-03 00:04 1742原文地址:http://www.javaarch.net/ ... -
Spring Security Form Login
2013-06-02 16:16 2149原文地址:http://www.javaarch.net/j ... -
spring3 的restful API RequestMapping介绍
2013-06-02 14:53 1155原文链接:http://www.javaarch.net/j ... -
Java Web使用swfobject调用flex图表
2013-05-28 19:05 1128Java Web使用swfobject调用 ... -
spring使用PropertyPlaceholderConfigurer扩展来满足不同环境的参数配置
2013-05-21 15:57 3344spring使用PropertyPlaceholderCon ... -
java国际化
2013-05-20 20:57 4478java国际化 本文来自:http://www.j ... -
RSS feeds with Java
2013-05-20 20:52 1226RSS feeds with Java 原文来自:htt ... -
使用ibatis将数据库从oracle迁移到mysql的几个修改点
2013-04-29 10:40 1679我们项目在公司的大战略下需要从oracle ... -
线上机器jvm dump分析脚本
2013-04-19 10:48 2912#!/bin/sh DUMP_PIDS=`p ... -
spring3学习入门示例工程
2013-04-18 09:28 11331. github地址 https://github ... -
spring map使用annotation泛型注入问题分析
2013-04-15 13:30 8547今天在整一个spring的ioc学习demo,碰到 ...
相关推荐
《深入剖析Lucene 3.6.0:开源搜索引擎的核心技术》 Apache Lucene是一个高性能、全文本搜索库,它提供了完整的搜索引擎功能,包括索引、查询解析、排名等。在本文中,我们将深入探讨Lucene 3.6.0版本的核心特性,...
《Apache Lucene 3.6.0:搜索引擎技术的核心解析》 Apache Lucene是一个高性能、全文本搜索库,被广泛应用于各种搜索引擎的开发中。3.6.0版本是Lucene的一个重要里程碑,它提供了丰富的功能和改进,使得开发者能够...
标题与描述概述的知识点主要集中在Lucene的高亮显示功能,尤其是在处理中文分词时的性能优化策略。以下是对这些知识点的详细展开: ### Lucene的高亮显示 Lucene是一款高性能、全功能的文本搜索引擎库,其高亮显示...
### Lucene高亮显示详解 在全文搜索领域,Apache Lucene是业界标准的搜索引擎库,提供了强大的文本搜索功能。而在搜索结果中实现关键词高亮显示,可以极大地提升用户体验,让用户快速定位到搜索词所在的位置。本文...
lucene-core-3.6.0-sources 绝对可用
**SpringBoot+Lucene搜索结果高亮显示** 在现代Web应用程序中,强大的全文搜索引擎功能是不可或缺的,而Apache Lucene正是这样一个高效的、可扩展的开源全文检索库。在这个SpringBoot+Lucene的Demo中,我们将深入...
本压缩包中的代码着重展示了如何使用 Lucene 进行分页搜索和结果高亮显示。下面将详细解释这两个关键知识点。 **一、Lucene 分页搜索** 在大型数据集上进行搜索时,一次性返回所有结果并不实际,因此分页搜索显得...
lucene3.5高亮
《Lucene+HighLighter高亮显示实例解析》 在信息技术领域,搜索引擎的构建与优化是至关重要的一环,其中,如何有效地对搜索结果进行高亮显示,以突出关键信息,是提升用户体验的关键因素之一。本篇文章将深入探讨...
在实际应用中,你可能需要结合这两者,即根据多字段查询获取结果,然后对结果显示高亮。这需要对Lucene的API有深入的理解,包括如何构建和执行查询,如何获取文档字段的原始文本,以及如何使用Highlighter。 在提供...
lucene-3.6.0 api 手册, 最新的 , lucene 是个好东东, 一直在用, 之前还在使用3.1的,发现已经到3.6了, 落后啊
标题中的“lucene.net以及高亮的DLL文件”指的是在.NET环境中使用Lucene搜索引擎库时,涉及到了文本高亮显示的DLL组件。Lucene.Net是一个开源的全文检索库,它是Apache Lucene项目针对.NET Framework的移植版本,为...
本文将详细介绍如何使用Java和Lucene来实现HTML文本的高亮显示,以便用户在搜索结果中能快速识别关键词。提供的`HighLighterUtils.java`文件应该包含了实现这一功能的核心代码。 首先,我们需要理解高亮显示的基本...
lucene-core-3.6.0.jar,很好,很实用的一个包
在本教程中,我们将深入探讨Lucene中的高亮显示机制,这是搜索引擎返回结果时非常有用的一项功能,可以突出显示与查询匹配的关键字。在实际应用中,用户通常希望看到搜索词在文档中的确切位置,高亮显示使得这些匹配...
这个标题提到的"java实现高亮显示的jar包,lucene用的jar包"是指利用Lucene库进行文本搜索时,对搜索结果进行高亮显示的相关功能。下面我们将深入探讨Lucene的核心组件、高亮显示的实现原理以及相关jar包的作用。 ...
本文将深入探讨Lucene.NET如何进行中文分词以及高亮显示的实现。 ### 1. 中文分词 中文分词是将连续的汉字序列切分成具有语义的词语的过程,是自然语言处理(NLP)中的基础步骤。在Lucene.NET中,为了支持中文分词...
下面我们将深入探讨如何在Android环境中利用Lucene来创建一个高效、功能丰富的全文检索系统,并了解如何高亮显示搜索结果中的关键字。 首先,我们要理解全文检索的基本原理。全文检索是指通过建立倒排索引来快速...
**Lucene高亮显示** 在信息检索领域,用户通常希望在搜索结果中快速找到与查询相关的关键词,这就是所谓的“高亮显示”。Apache Lucene是一个强大的全文搜索引擎库,它提供了多种功能,包括高亮显示搜索结果。高亮...
标题"IKAnalyzer LUCENE.4.9 中文分词的高亮显示"表明我们将探讨如何使用IKAnalyzer与Lucene 4.9版本相结合,实现搜索结果的关键词高亮功能。高亮显示有助于用户快速识别和理解搜索结果中的重要信息。 IKAnalyzer的...