`
deepfuture
  • 浏览: 4400453 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80078
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70048
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103357
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:285814
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15012
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67563
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32151
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45989
社区版块
存档分类
最新评论

lucene-对每个字段指定分析器及较复杂搜索页面(对QQ国内新闻搜索)

阅读更多

1、

JAVA代码(索引)

package bindex;

import java.io.IOException;
import java.net.URL;

import jeasy.analysis.MMAnalyzer;
import org.apache.lucene.analysis.PerFieldAnalyzerWrapper;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.LockObtainFailedException;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.beans.LinkBean;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.NotFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.filters.RegexFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class perfieldindextest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String indexpath="./indexes";

IndexWriter writer;
PerFieldAnalyzerWrapper wr;
Document doc;
try {
writer=new IndexWriter(indexpath,new StandardAnalyzer());
wr=new PerFieldAnalyzerWrapper(new StandardAnalyzer());
wr.addAnalyzer("title",new MMAnalyzer());
wr.addAnalyzer("content", new MMAnalyzer());
wr.addAnalyzer("author", new MMAnalyzer());
wr.addAnalyzer("time", new StandardAnalyzer());
//提取腾迅国内新闻链接
LinkBean lb=new LinkBean();
lb.setURL("http://news.qq.com/china_index.shtml");
URL[] urls=lb.getLinks();
for (int i=0;i<urls.length;i++){
doc=new Document();
String title="";
String content="";
String time="";
String author="";
System.out.println("正在提取网页第"+i+"个链接("+(int)(100*(i+1)/urls.length)+"%)["+urls[i].toString()+"].....");
if (!(urls[i].toString().startsWith("http://news.qq.com/a/"))){
System.out.println("非新闻链接,忽略......");continue;
}
System.out.println("新闻链接,正在处理");
Parser parser=new Parser(urls[i].toString());
parser.setEncoding("GBK");
String url=urls[i].toString();
NodeFilter filter_title=new TagNameFilter("title");
NodeList nodelist=parser.parse(filter_title);
Node node_title=nodelist.elementAt(0);
title=node_title.toPlainTextString();
System.out.println("标题:"+title);
parser.reset();
NodeFilter filter_auth=new OrFilter(new HasAttributeFilter("class","auth"),new HasAttributeFilter("class","where"));
nodelist=parser.parse(filter_auth);
Node node_auth=nodelist.elementAt(0);
if (node_auth != null) author=node_auth.toPlainTextString();
else author="腾讯网";
node_auth=nodelist.elementAt(1);
if (node_auth != null) author+=node_auth.toPlainTextString();
System.out.println("作者:"+author);
parser.reset();
NodeFilter filter_time=new OrFilter(new HasAttributeFilter("class","info"),new RegexFilter("[0-9]{4}年[0-9]{1,2}月[0-9]{1,2}日[' ']*[0-9]{1,2}:[0-9]{1,2}"));
nodelist=parser.parse(filter_time);
Node node_time=nodelist.elementAt(0);
if (node_time.getChildren()!=null) node_time=node_time.getFirstChild();
time=node_time.toPlainTextString().replaceAll("[ |\t|\n|\f|\r\u3000]","").substring(0,16);
System.out.println("时间:"+time);
parser.reset();
NodeFilter filter_content=new OrFilter(new OrFilter(new HasAttributeFilter("style","TEXT-INDENT: 2em"),new HasAttributeFilter("id","Cnt-Main-Article-QQ")),new HasAttributeFilter("id","ArticleCnt"));
nodelist=parser.parse(filter_content);
Node node_content=nodelist.elementAt(0);
content=node_content.toPlainTextString().replaceAll("(#.*)|([a-z].*;)|}","").replaceAll(" |\t|\r|\n|\u3000","");
System.out.println("内容:"+content);
System.out.println("正在索引.....");
Field field=new Field("title",title,Field.Store.YES,Field.Index.TOKENIZED);
doc.add(field);
field=new Field("content",content,Field.Store.YES,Field.Index.TOKENIZED);
doc.add(field);
field=new Field("author",author,Field.Store.YES,Field.Index.UN_TOKENIZED);
doc.add(field);
field=new Field("time",time,Field.Store.YES,Field.Index.NO);
doc.add(field);
field=new Field("url",url,Field.Store.YES,Field.Index.NO);
doc.add(field);
writer.addDocument(doc,new MMAnalyzer());
System.out.println("<"+title+"索引成功>");
}
writer.close();
wr.close();
} catch (ParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

笔者BLOG:http://blog.163.com/sukerl@126/

Servlet代码(搜索):

package bservlet;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.*;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;

import java.io.*;

import jeasy.analysis.MMAnalyzer;


public class SluceneSearcher extends HttpServlet {
private String indexpath="D:/workspace/testsearch2/indexes";
public void doPost(HttpServletRequest request,HttpServletResponse response){
StringBuffer sb=new StringBuffer("");
try {
request.setCharacterEncoding("GBK");
String phrase=request.getParameter("phrase");
Analyzer analyzer=new MMAnalyzer();
IndexSearcher searcher;
searcher = new IndexSearcher(indexpath);
QueryParser parser=new QueryParser("content",analyzer);
Query q= parser.parse(phrase);
Hits hs=searcher.search(q);
int num=hs.length();
sb.append("<h1>您搜索到的记录数:"+num+"</h1>");
for (int i=0;i<num;i++){
Document doc=hs.doc(i);
if (doc==null){
continue;
}
Field field_title=doc.getField("title");
String title="<br><a href="+doc.getField("url").stringValue()+" target='_blank'>"+field_title.stringValue()+"</a><br>";
Field field_author=doc.getField("author");
String author="<br>author:<br>"+field_author.stringValue();
Field field_time=doc.getField("time");
String time="<br>time:<br>"+field_time.stringValue();
sb.append(title);
sb.append(author);
sb.append(time);
}
searcher.close();
} catch (CorruptIndexException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintWriter out;
try {
response.setContentType("text/html;charset=GBK");
out = response.getWriter();
out.print(sb.toString());
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public void doGet(HttpServletRequest request,HttpServletResponse response){
doPost(request,response);
}

}


WEB.XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
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.
-->

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">

<display-name>news-search</display-name>
<description>
news-search
</description>
<servlet>
<servlet-name>newssearch</servlet-name>
<servlet-class>bservlet.SluceneSearcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>newssearch</servlet-name>
<url-pattern>/deepfuturesou</url-pattern>
</servlet-mapping>

</web-app>

注意deepfuturesou是虚拟路径,不要实际建立该目录,但必须注意要和搜索网页中指定的保持一致,与对应的servlet保持一致。

搜索网页:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>腾讯国内新闻搜索</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="deepfuturesou">
搜索关键字
<input name="phrase" type="text" id="phrase" />
<input type="submit" name="Submit" value="搜索" />
</form>
</body>
</html>

2、效果(对QQ国内新闻搜索)

正在提取网页第0个链接(0%)[http://news.qq.com/china_index.shtml#].....
非新闻链接,忽略......
正在提取网页第1个链接(1%)[http://3g.qq.com].....
非新闻链接,忽略......
正在提取网页第2个链接(1%)[http://www.qq.com].....
非新闻链接,忽略......
正在提取网页第3个链接(2%)[http://news.qq.com/].....
非新闻链接,忽略......
正在提取网页第4个链接(3%)[http://news.qq.com/photo.shtml].....
非新闻链接,忽略......
正在提取网页第5个链接(3%)[http://news.qq.com/scroll/now.htm].....
非新闻链接,忽略......
正在提取网页第6个链接(4%)[http://news.qq.com/paihang.htm].....
非新闻链接,忽略......
正在提取网页第7个链接(5%)[http://news.qq.com/china_index.shtml].....
非新闻链接,忽略......
正在提取网页第8个链接(5%)[http://news.qq.com/world_index.shtml].....
非新闻链接,忽略......
正在提取网页第9个链接(6%)[http://news.qq.com/society_index.shtml].....
非新闻链接,忽略......
正在提取网页第10个链接(6%)[http://report.qq.com/].....
非新闻链接,忽略......
正在提取网页第11个链接(7%)[http://news.qq.com/military.shtml].....
非新闻链接,忽略......
正在提取网页第12个链接(8%)[http://view.news.qq.com/index/zhuanti/zt_more.htm].....
非新闻链接,忽略......
正在提取网页第13个链接(8%)[http://view.news.qq.com/].....
非新闻链接,忽略......
正在提取网页第14个链接(9%)[http://news.qq.com/topic/feature.htm].....
非新闻链接,忽略......
正在提取网页第15个链接(10%)[http://blog.qq.com/news/].....
非新闻链接,忽略......
正在提取网页第16个链接(10%)[http://news.qq.com/photon/videonews/morevideo.htm].....
非新闻链接,忽略......
正在提取网页第17个链接(11%)[http://bj.qq.com/].....
非新闻链接,忽略......
正在提取网页第18个链接(11%)[http://sh.qq.com/].....
非新闻链接,忽略......
正在提取网页第19个链接(12%)[http://gd.qq.com/].....
非新闻链接,忽略......
正在提取网页第20个链接(13%)[http://cq.qq.com/].....
非新闻链接,忽略......
正在提取网页第21个链接(13%)[http://xian.qq.com/].....
非新闻链接,忽略......
正在提取网页第22个链接(14%)[http://cd.qq.com/].....
非新闻链接,忽略......
正在提取网页第23个链接(15%)[http://js.qq.com/].....
非新闻链接,忽略......
正在提取网页第24个链接(15%)[http://zj.qq.com/].....
非新闻链接,忽略......
正在提取网页第25个链接(16%)[http://sd.qq.com/].....
非新闻链接,忽略......
正在提取网页第26个链接(16%)[http://news.qq.com/{clickurl}].....
非新闻链接,忽略......
正在提取网页第27个链接(17%)[http://news.qq.com/{clickurl}].....
非新闻链接,忽略......
正在提取网页第28个链接(18%)[http://news.qq.com/{clickurl}].....
非新闻链接,忽略......
正在提取网页第29个链接(18%)[http://news.qq.com/china_index.shtml#].....
非新闻链接,忽略......
正在提取网页第30个链接(19%)[http://news.qq.com/a/20091127/000644.htm].....
新闻链接,正在处理
标题:组图:武汉东湖上千万摇蚊引发多起车祸_新闻国内_新闻_腾讯网
作者:中国新闻网
时间:2009年11月27日10:00
内容:中&白色大理石护栏被摇蚊“刷黑”。中新社发楚天行摄functionSplitPages(name,pageID,listID){SplitPages.prototype.checkPages=function(){SplitPages.prototype.createHtml=function(mode){if(this.pageCount>this.page+2){else{i++){if(i>0){if(i==this.page){else{if(i!=1&&i!=this.pageCount){SplitPages.prototype.Output=function(mode){SplitPages.prototype.setPage=function(mode){$(window.onload=function(){varimgsimgs=$("imgsimgs")changeImg(imgsimgs)近日由于气温上升,武汉东湖沙滩浴场附近的环湖路上落下大量摇蚊,过往汽车碾压后,成“油垢”致路面异常光滑,引发多起车祸。2009年11月24日7时许,一辆黑色轿车,在东湖沙滩浴场旁的弯道处突然失控,撞到路旁的石头上,车头面目全非。这是当天早晨在这里发生的第4起,一辆汽车还将一棵脸盆粗的大树撞到湖里。另外还有5、6辆摩托车也在这里滑倒。东湖环卫管理处派出职工,用高压水枪来清洗路面的“油垢”,以防汽车打滑。[责任编辑:morganli]
正在索引.....
<组图:武汉东湖上千万摇蚊引发多起车祸_新闻国内_新闻_腾讯网索引成功>
正在提取网页第31个链接(20%)[http://news.qq.com/a/20091127/000644.htm].....

分享到:
评论

相关推荐

    lucene-core-2.9.2.jar

    Lucene提供了一个强大的API,使得开发者能够对文本进行索引和搜索,支持布尔逻辑、短语搜索、近似搜索、通配符搜索等多种高级查询功能。 二、lucene-core-2.9.2.jar详解 1. 模型与数据结构:Lucene的核心库主要...

    lucene-2.9.2.jar包+源码

    通过源码分析,我们可以了解到Lucene如何计算这两个值,并结合它们确定搜索结果的排序。 在Lucene-2.9.2的源码中,你可以看到关于TF-IDF的具体实现,如`TFIDFSimilarity`类,它是Lucene对TF-IDF算法的封装。它不仅...

    Lucene-common-functions-introduced_v1

    8. **多语言支持(Multilingual Support)**:Lucene内置了多种语言的分析器,可以处理不同语言的文本,如英文、中文、法文等。 9. **分布式搜索(Distributed Search)**:通过Solr或Elasticsearch等项目,Lucene...

    Lucene实战

    每个字段可以有自己的分析器,以适应不同的搜索需求。 5. **查询解析** Lucene提供了一种查询语言,允许用户输入自然语言查询。查询解析器将这些查询转化为内部表示,以便于执行搜索。 6. **搜索算法** Lucene...

    lucene3.0.3搜索的使用示例

    Apache Lucene 是一个开源全文搜索引擎库,为开发者提供了在各种应用程序中实现高级搜索功能的工具。这个"lucene3.0.3搜索的使用示例"压缩包文件很可能是为了帮助用户理解并学习如何在项目中应用Lucene 3.0.3版本的...

    luke-Lucene 7.1.0

    2. **查询性能**:在查询处理方面,Lucene 7.1.0增强了对复杂查询的处理能力,如多字段查询、短语查询和模糊查询。查询解析器的优化使查询构造更加灵活,同时提升了查询执行速度。 3. **内存管理**:针对大规模索引...

    luke-7.1.0 lucene索引查看工具

    这个7.1.0版本提供了对Lucene索引的强大洞察力,帮助开发者、搜索引擎优化者以及数据分析师深入了解索引结构和内容。 **一、Lucene简介** Lucene是一款开源的全文检索库,由Java编写,广泛应用于各种搜索应用。它...

    Lucene全文检索案例

    通过`Field`对象设置不同的分析器,可以实现对不同字段的定制化搜索。 9. **扩展性与复杂查询** Lucene支持复杂的查询表达式,如布尔查询、短语查询、范围查询等。此外,还可以利用Filter和QueryWrapperFilter实现...

    LuceneDemo

    2. 字段(Field):字段是文档的组成部分,每个字段都有特定的含义,例如,新闻文章的标题和内容可以分别作为两个不同的字段。 3. 分词器(Analyzer):分词器负责将文档字段的文本进行分词处理,生成一系列的...

    lucene.jar

    2. 字段(Field):文档的组成部分,每个字段有特定的名称和内容,如标题、内容等。 3. 分词器(Analyzer):用于将文档内容分解成可搜索的关键词,不同语言和应用场景可能需要不同的分词策略。 4. 索引(Index):...

    Lucene5.21+IkAnalyzer

    3. **定义文档**:在Lucene中,每个要被搜索的数据被视为一个Document对象,包含多个Field,每个Field表示文档的一个属性。例如,你可以创建一个包含标题和内容的Document,并使用IkAnalyzer对这两个Field进行分析。...

    Lucene7.0.1 中文完整Jar包 包含所有jar

    1. **文档(Document)**:在Lucene中,每个文档都是一组字段(Field)的集合,用于表示待搜索的信息。例如,一篇文章可以被看作一个文档,包含标题、内容、作者等字段。 2. **字段(Field)**:文档中的每一个属性...

    ik分词器2012和lucene的资源和jar包以及lucene索引查看工具

    除了基础的文本搜索,IK分词器和Lucene还可以结合其他技术,如NLP(自然语言处理)和信息抽取,实现更复杂的文本分析功能,如情感分析、关键词提取、主题模型等。 总的来说,IK分词器和Lucene是Java开发中的重要...

    Lucene实战讲解

    - 分析器(Analyzer):负责将文本拆分为可搜索的单元(称为“术语”或“tokens”)。 - 索引(Index):将文档内容转化为倒排索引,便于快速搜索。 - 文档(Document):存储要被索引的信息,可以包含多个字段(Field)...

    solr 分词器 mmseg4j IKAnalyzer

    - 在 `schema.xml` 文件中定义字段类型(field type),并指定对应的分析器。 - 将对应的 jar 包添加到 Solr 的类路径中,这可以通过修改 `solrconfig.xml` 文件中的 `lib` 标签来实现。 - 配置分词器和过滤器链,这...

    luck 4.10.3.jar工具

    8. **配置自定义分析器**:用户可以在Luck中配置和测试不同的分析器,以评估它们对索引和搜索性能的影响。 使用 Luck 4.10.3.jar,开发人员和管理员可以有效地调试Lucene索引,检查搜索结果的准确性,以及优化搜索...

    Web方式的SVN全文搜索功能实现

    2. **分析器**:选择合适的分析器对文本内容进行分词处理,如StandardAnalyzer或WhitespaceAnalyzer。 3. **索引写入**:使用IndexWriter将文档写入索引库。 4. **优化索引**:定期执行索引优化操作,合并分段以提高...

    luence客户端测试软件luke

    "luence客户端测试软件luke" 指的是一个名为"Luke"的工具,它是针对Apache Lucene(一个流行的全文搜索引擎库)的客户端测试和分析工具。Luence可能是“Lucene”的拼写错误,但在这里我们假设指的是Lucene。 **描述...

    solr 4.10&

    Solr 4.10是Apache Solr的一个版本,它是一个开源的企业级全文搜索引擎,广泛应用于数据检索、网站搜索、企业内部搜索等场景。Solr以其高性能、可扩展性和易于管理的特点,在IT行业中深受青睐。在Solr 4.10版本中,...

    solr各种最近的jar包

    4. **Lucene库**:Solr是建立在Lucene之上,因此,压缩包中会有多个与Lucene相关的jar包,如`lucene-core.jar`、`lucene-analyzers-common.jar`等,它们提供了文本分析、搜索算法、文档存储等功能。 5. **SolrCloud...

Global site tag (gtag.js) - Google Analytics