Lucene学习

1、原理

  • 数据:结构化数据和非结构化数据linux

    • 结构化数据:指具备固定格式或有限长度的数据,如数据库、元数据..
    • 非结构化数据(全文数据):指不定长或无固定格式的数据,如邮件,world..
  • 搜索数据算法

    • 结构化数据:数据库(sql语句),元数据(文件名、类型、修改时间)
    • 非结构化数据(全文数据)顺序扫描(linux的grep),全文检索(分词)(Google和百度)
      • 顺序扫描:对目标文件进行全文查询,一个文档一个文档,从头到位查询字符串。
      • 全文检索(分词):根据关键字提早创建索引,而后对索引进行搜索。
  • 分词索引建立(Indexing)和搜索索引(Search)sql

    • 索引建立(Indexing):将添加的全部结构化和非结构化数据提取信息,建立索引的过程。
    • 搜索索引(Search):经过查询索引,获取目标地址,查询目标,返回结果
  • 底层数据结构数据库

    • 字典(左侧结构): 保存了一系列的字符串。
    • 倒排序表(右侧结果):含有这些字符串的目标地址。

输入图片说明

* **最后的结构**
    * **document Frequency**:文档频次,总共右多少文件包含词
    * **Frequency**:此文件中包含了**几回此词**

输入图片说明

  • 逻辑过程
    • 索引建立(Indexing)
      • 构建一个分词器
      • 肯定索引文件存储的位置,lucene提供本地文件内存存储
      • 建立IndexWriter,进行索引文件的写入
      • 内容提取**(根据单字、二分、词库分词)**、进行索引的存储
    • 搜索索引(Search)
      • 打开存储位置
      • 建立搜索器
      • 查询
      • 关闭查询器
    • 例如:查找lucene和solr字符串的文档
      • 取出全部保护字符串 lucene 的文档链表
      • 取出包含字符串 solr 的文档链表
      • 经过合并链表,而后返回须要目标文件

输入图片说明

* 总体逻辑图

输入图片说明

  • 中文分词器原理(例如:我是中国人)
    • 单字分词:一个一个字进行分词。("我","们","是","中","国","人")
    • 二分法:按照两个字进行切分。("咱们","们是","是中","中国","国人")
    • 词库分词:按照某种算法构造词,而后去匹配已建好的词库集合,若是匹配到就切分出来成为词语,一般词库分词被认为是最好的中文分词算法。

3、使用

  • 基本demo(7.2)
@Test
	public void testDemo() throws IOException{
		Analyzer analyzer = new StandardAnalyzer();
		
		//存放在disk上
		final Path path = Paths.get(targetFileIndex);
		Directory directory = FSDirectory.open(path);
		
		//写入器
		IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
		IndexWriter iw = new IndexWriter(directory,iwc);
		
		Document doc = new Document();
		String text = "This is the text to be indexed";
		doc.add(new Field("fileName",text,TextField.TYPE_STORED));
		iw.addDocument(doc);
		iw.close();
		
	}

	@Test
	public void testFind() throws IOException, ParseException {
		Analyzer analyzer = new StandardAnalyzer();
		//从disk上读取
		final Path path = Paths.get(targetFileIndex);
		Directory directory = FSDirectory.open(path);
		DirectoryReader dr =  DirectoryReader.open(directory);
		
		//索引查询器
		IndexSearcher isc = new IndexSearcher(dr);
		QueryParser parser = new QueryParser("filename",analyzer);
		
		Query query = parser.parse("text");
		ScoreDoc[] hits = isc.search(query, 1000).scoreDocs;;
		
		for (int i = 0; i < hits.length; i++) {
			Document hitDoc = isc.doc(hits[i].doc);
	    }
		dr.close();
	    directory.close();
	}
相关文章
相关标签/搜索