必威体育Betway必威体育官网
当前位置:首页 > IT技术

简单垂直搜索引擎入门(java+Lucene)

时间:2019-09-01 18:42:17来源:IT技术作者:seo实验室小编阅读:88次「手机版」
 

垂直搜索引擎

一、垂直搜索引擎介绍

垂直搜索引擎是搜索引擎的一种,是搜索引擎的细分和延伸,可以简单地理解为在某个领域的搜索引擎,例如在你的所有文档中搜索相关内容,在你的项目文件中搜索带有“test”字眼的文档。

二、Lucene介绍

Lucene是一款开源的,高性能,可扩展的信息检索工具库;是一个java实现的jar包用来管理搜索引擎索引库。可以从Lucene官网下载最新版本的Lucene,本文采用的是旧版Lucene,4.6版本,在CSDN上有大神提供这个版本的下载。

三、搜索引擎原理

一个完整的搜索引擎例如Google百度等等,首先要做的事情是信息获取,所谓信息获取,对于他们来说就是利用爬虫技术网络上的大部分内容爬取下来,至于爬虫如何爬取网络,如何避免网站重复爬取等等问题,这里就不细讲了;当我们在用一个搜索引擎时,它能够在极端的时间内查询到你所需要的信息并排好序发送给用户,在这么短的时间内,在一个庞大的数据库中搜索内容可想而知有多么困难,而搜索引擎之所以能够如此快速地查询关键在于数据库的索引。

网络爬虫将爬取的内容分解、分析,并以巨大的表格形式存入数据库,这个过程就是建立索引的过程;搜索引擎的核心数据结构为倒排索引(Inverted index),倒排索引是相对于正向索引来说的,首先用正向索引来存储每个文档对应的单词列表,然后再建立倒排索引,根据单词来索引文档编号。

用户在输入需要的搜索的内容后,搜索引擎首先要对搜索内容进行分词,然后进行去除停用词等操作,然后再进行搜索,从索引数据库中找出所有包含搜索词的内容。最后一步工作,就是对所有搜索得到的内容进行排序,排序的方法就有些复杂很有意思了,这里暂时不讲,这篇文章实现了建立倒排索引与返回未排序搜索结果。

搜索引擎原理:

四、环境配置

既然Lucene是基于java的首先需要配置jdk,不介绍了........

下载了Lucene4.6之后将Lucene拷贝至自己的java工程中,我使用的IDE是Eclipse,在Eclipse中需要将相关的jar包导入到项目中,这里要用到的jar包有core/lucene-core-4.6.0.jar;analysis/lucene-analyzers-common-4.6.0.jar;queryparser/lucene-queryparser-4.6.0.jar

五、具体代码

package Test1;

import java.io.File;  
import java.io.FileReader;

import org.apache.lucene.analysis.Analyzer;  
import org.apache.lucene.analysis.standard.StandardAnalyzer;  
import org.apache.lucene.document.Document;  
import org.apache.lucene.document.field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;  
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;  
import org.apache.lucene.store.FSDirectory;  
import org.apache.lucene.util.Version;  
  
public class HelloLucene {  
    /** 
     * 建立索引 
     */  
    public void index() {  
        IndexWriter indexWriter = null;  
        try {  
            // 1、创建Directory  
            Directory directory = FSDirectory.open(new File("index/"));  
  
            // 2、创建IndexWriter  
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);  
            IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_46, analyzer);  
            indexWriter = new IndexWriter(directory, indexWriterConfig);  
  
            File dFile = new File("documents/");
            File[] files = dFile.listFiles();
            for (File file : files) {
                // 3、创建Document对象
                Document document = new Document();
  
                // 4、为Document添加Field
                // 第三个参数是FieldType 但是定义在TextField中作为静态变量,看API也不好知道怎么写  
                document.add(new Field("content", new FileReader(file), TextField.TYPE_NOT_STORED));  
                document.add(new Field("filename", file.getName(), TextField.TYPE_STORED));  
                document.add(new Field("filepath", file.getabsolutePath(), TextField.TYPE_STORED));  
  
                // 5、通过IndexWriter添加文档到索引中  
                indexWriter.addDocument(document);  
            }
        } catch (Exception e) {  
            e.printstacktrace();  
        } finally {  
            try {  
                if (indexWriter != null) {  
                    indexWriter.close();  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }
    }
    
    //搜索方法,返回文件名和文件路径
    public void search(String con) {  
        DirectoryReader directoryReader = null;  
        try {  
            // 1、创建Directory  
            Directory directory = FSDirectory.open(new File("index/"));  
            // 2、创建IndexReader  
            directoryReader = DirectoryReader.open(directory);  
            // 3、根据IndexReader创建IndexSearch
            IndexSearcher indexSearcher = new IndexSearcher(directoryReader);  
            // 4、创建搜索的Query  
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);  
            // 创建parser来确定要搜索文件的内容,第二个参数为搜索的域  
            QueryParser queryParser = new QueryParser(Version.LUCENE_46, "content", analyzer);  
  
            // 创建Query表示搜索域为content包含con的文档  
            Query query = queryParser.parse(con);  
  
            // 5、根据searcher搜索并且返回TopDocs  
            TopDocs topDocs = indexSearcher.search(query, 1);  
  
            // 6、根据TopDocs获取ScoreDoc对象  
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;  
            for (ScoreDoc scoreDoc : scoreDocs) {
                // 7、根据searcher和ScoreDoc对象获取具体的Document对象  
                Document document = directoryReader.document(scoreDoc.doc);
                // 8、根据Document对象获取需要的值  
                System.out.println(document.get("filename") + " " + document.get("filepath"));  
            }
        } catch (Exception e) {
            e.printStackTrace();  
        } finally {  
            try {  
                if (directoryReader != null) {  
                    directoryReader.close();  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
    }
}
package Test1;

public class LuceneTest {
	public static void main(String args[]){
		HelloLucene helloLucene = new HelloLucene();
		helloLucene.index();
		helloLucene.search("测试");
	}
}

数据内容:

1、test.txt

测试lucene

2、hahah.txt

测试2

3、pupup.txt

hahahaha

运行结果:

相关阅读

促进优质SEO网站会被搜索引擎推荐为前三排名

处理用户需求问题。用户需求一直是我们重视的关键,任何的网络营销行为都在盘绕这个主题来进行的,这个依然是需要从工作网站数据剖析

搜索引擎研究之一:选型

Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。它可以用于全文搜索,结构化搜

从垂直电商失败案例看聚美优品上市:上市需谨慎

“全而杂不如专而精”,显然不适用于电商行业,从2010年麦考林上市纳斯达克一度下滑濒临退市困境,到凡客七番融资未曾上市反

搜索引擎怎么优化,搜索引擎之间有什么关系?

搜索引擎常见的也就是百度、谷歌、360和搜狗,但是作为国内最大的搜索引擎百度是众多SEOER研究的重点对象,其实这四种搜索引擎都可以

搜索引擎排名等级及进阶的SEO过程

所谓进阶就是指从原始状态到高级状态,从低级到高级,一步步是怎么演变的。我在《SEO为什么没办法快速见效》中说:关键词有竞争等级,什

分享到:

栏目导航

推荐阅读

热门阅读