`
landows
  • 浏览: 18340 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用lucene PrefixQuery 根据拼音前缀查询

 
阅读更多
PrefixQuery类似于 数据库中的 like 'a%'查询
以下是测试代码,这种方式的缺陷是人为的分出了更多的term,目前还在找有没有更优的方法。
测试代码:
public static String index_path3="D:\\ix3";
	public static void main(String[]args) throws Exception{
		

		//createPrefixIndex();
                //前缀查询
		Query trquery  = new PrefixQuery(new Term("pinyin","ghai" ));   

		IndexReader  indexReader = IndexReader.open(FSDirectory.open(new File(index_path3)));
		
		Searcher  searcher = new IndexSearcher(indexReader);
		
		TopDocs topDocs = searcher.search(trquery,100);
		
		for (ScoreDoc hits:topDocs.scoreDocs){
			Document doc = searcher.doc(hits.doc);
			System.out.println("doc = "+doc.get("hotelName"));
		}
		
	}
	/**
	 * 创建pinyin索引
	 */
	public static void createPrefixIndex(){
		Analyzer  analyzer = new IKAnalyzer();
		PerFieldAnalyzerWrapper  perFieldAnalyzerWrapper = new PerFieldAnalyzerWrapper(analyzer);
		try {
			
			//perFieldAnalyzerWrapper.addAnalyzer("price", new WhitespaceAnalyzer());
			IndexWriter writer = new IndexWriter(FSDirectory.open(new File(index_path3)), perFieldAnalyzerWrapper, true,IndexWriter.MaxFieldLength.LIMITED);
			Document doc  = new Document();
			String pinyin="shanghai";
			
                         int len = pinyin.length();   
			//将拼音截取保存
                        for(int i=0;i<len;i++){   
				String value = pinyin.substring(i,len);   
				doc.add(new Field("pinyin", value, Field.Store.YES, Field.Index.NOT_ANALYZED));
			}
			doc.add(new Field("hotelName", "test2", Field.Store.YES, Field.Index.ANALYZED));

			writer.addDocument(doc);
			
			doc  = new Document();
			doc.add(new Field("hotelName", "test3", Field.Store.YES, Field.Index.ANALYZED));
			pinyin="beijing";
			len = pinyin.length();   
			for(int i=0;i<len;i++){   
				String value = pinyin.substring(i,len);   
				doc.add(new Field("pinyin", value, Field.Store.YES, Field.Index.NOT_ANALYZED));
			}
			writer.addDocument(doc);
			
			doc  = new Document();
			doc.add(new Field("hotelName", "test6", Field.Store.YES, Field.Index.ANALYZED));
			pinyin="zhongguo_benxi";
			len = pinyin.length();   
			for(int i=0;i<len;i++){   
				String value = pinyin.substring(i,len);   
				doc.add(new Field("pinyin", value, Field.Store.YES, Field.Index.NOT_ANALYZED));
			}
			writer.addDocument(doc);
			
			doc  = new Document();
			doc.add(new Field("hotelName", "test1", Field.Store.YES, Field.Index.ANALYZED));
			pinyin="tianjin";
			len = pinyin.length();   
			for(int i=0;i<len;i++){   
				String value = pinyin.substring(i,len);   
				doc.add(new Field("pinyin", value, Field.Store.YES, Field.Index.NOT_ANALYZED));
			}
			writer.addDocument(doc);
			
		
			
			writer.close();
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
分享到:
评论

相关推荐

    Lucene 搜索方法(前缀搜索)

    首先,前缀搜索的核心在于`PrefixQuery`类,它是Lucene提供的一个查询类,用于执行以特定前缀开头的搜索。在`PrefixQueryDemo.java`文件中,我们可以看到如何创建和执行此类查询的示例代码。以下是一些关键步骤: 1...

    lucene6.6+拼音分词+ik中文分词包

    《深入理解Lucene 6.6:拼音与IK中文分词技术详解》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用。在处理中文文本时,分词是至关重要的一步,它决定了搜索的精度和效果。本文将详细讲解如何在...

    Lucene5学习之拼音搜索

    3. **查询处理**:在用户输入拼音查询时,也需要将拼音转换为汉字,并对每个拼音进行匹配。匹配过程中,不仅要考虑完全匹配,还要处理部分拼音、同音字等复杂情况。 4. **评分与排序**:为了提供准确的搜索结果,...

    拼音分词 Pinyin4j+pinyinAnalyzer+lucene-analyzers

    pinyinAnalyzer是Lucene的一个分析器,它利用了Pinyin4j的功能,能够将输入的中文文本分词并转化为拼音形式,以便于Lucene这样的全文搜索引擎进行索引和查询。而lucene-analyzers则是Lucene的一系列分析器集合,包含...

    lucene的查询语法事例

    在使用Lucene进行信息检索时,理解和掌握其查询语法至关重要。本篇文章将深入探讨Lucene的查询语法,帮助你更好地进行数据查询与分析。 ### 1. 基本查询语法 Lucene的查询语法基于简单的字符串匹配,主要包含以下...

    lucene与数据库连接进行查询

    在这个"lucene与数据库连接进行查询"的主题中,我们主要探讨如何将 Lucene 与 JDBC(Java Database Connectivity)结合,通过数据库连接来获取数据并利用 Lucene 进行处理。 首先,我们需要了解如何使用 JDBC 连接...

    lucene 多字段查询+文字高亮显示

    这需要对Lucene的API有深入的理解,包括如何构建和执行查询,如何获取文档字段的原始文本,以及如何使用Highlighter。 在提供的链接博客文章中,作者可能会详细解释如何设置和使用这些功能,包括示例代码和步骤。...

    Lucene时间区间搜索

    Lucene支持多种查询类型,例如TermQuery、PrefixQuery、RangeQuery等。在时间区间搜索中,我们通常会用到RangeQuery。RangeQuery允许我们在指定的范围内查找匹配的文档,包括或者不包括边界。例如,我们可以创建一个...

    lucene创建修改删除组合条件查询

    在IT领域,Lucene是一个非常重要的全文搜索引擎库,它提供了高效、可扩展的搜索功能。在本主题中,我们将深入探讨如何使用...在实际应用中,还需要注意性能优化,如合理使用索引,以及根据业务场景选择合适的查询策略。

    Lucene5学习之分页查询

    本文将深入探讨"Lucene5学习之分页查询"这一主题,结合给定的标签"源码"和"工具",我们将讨论如何在Lucene5中实现高效的分页查询,并探讨其背后的源码实现。 首先,理解分页查询的重要性是必要的。在大型数据集的...

    Lucene 索引的简单使用

    本篇文章将详细阐述如何使用Lucene来创建和查询索引,帮助你深入理解其核心概念和操作流程。 ### 1. Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段...

    Lucene建索引及查询关键字

    在Eclipse环境中运用java,Lucene建索引及查询关键字

    lucene相关jar+查询分析器jar

    5. **查询语法**:Lucene支持布尔运算符(AND, OR, NOT)、短语查询、前缀查询、范围查询等多种查询类型。例如,"title:(+java -script)"表示查询标题中包含"java"但不包含"script"的文档。 6. **性能优化**:...

    Lucene3.0之查询类型详解

    【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...

    lucene高级智能查询小案例

    在高级查询中,我们可能会利用FuzzyQuery进行模糊匹配,或者使用PrefixQuery进行前缀搜索,这些都能极大地提高用户查询的灵活性。 在智能查询中,更常见的功能是短语查询和近似查询。SpanQuery类族提供了一种精确...

    Lucene使用代码实例之搜索文档

    根据不同的查询需求,`Query`有多个子类,如`TermQuery`、`BooleanQuery`和`PrefixQuery`等。这些子类用于将用户的查询字符串转化为Lucene可以理解和执行的结构。 接着,我们关注`Term`类,它是Lucene中表示搜索的...

    使用Lucene对doc、docx、pdf、txt文档进行全文检索功能的实现 - 干勾鱼的CSDN博客 - CSDN博客1

    根据需要,可以使用 `HitCollector` 或 `TopDocs` 来获取结果集。 总之,通过结合Apache Lucene、Apache POI 和 Apache PDFBox,我们可以实现对doc、docx、pdf、txt等格式文档的全文检索功能。这个过程涉及到文件...

    使用lucene全文检索数据库

    **使用Lucene全文检索数据库** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它是Java编写的,能够帮助开发者在各种应用程序中实现强大的全文检索功能。在这个项目中,我们将探讨如何利用Lucene ...

    lucene表达式处理查询

    因此,在实际应用中,需要根据性能需求合理设计查询表达式,并可能需要对索引进行优化,比如使用过滤器、预计算查询等技术。 ### 6. 结论 Lucene的表达式查询为开发人员提供了强大的工具,能够处理复杂的查询需求...

    使用Lucene.net进行全文搜索

    本文将深入探讨如何使用Lucene.NET进行全文搜索,特别是针对多关键字匹配的场景。 首先,我们需要了解Lucene.NET的基本概念。Lucene是一个开源的文本搜索库,它的核心功能包括文档索引、搜索和排序。Lucene.NET是这...

Global site tag (gtag.js) - Google Analytics