`

有关Lucene的问题(1):为什么能搜的到“中华 AND 共和国”却搜不到“中华共和国”?

阅读更多

问题:

使用中科院的中文分词对“中华人民共和国” 进行索引,它被分词为"中华", "人民", "共和国",用“人民共和国”进行搜索,可以搜到,而搜索"中华共和国"却搜索不到,用“中华 AND 共和国”却可以搜出来,为什么?

回答:

我下载了http://ictclas.org/Download.html中科院的词做了简单的分析,如果索引的时候“中华人民共和国”被分成了“中华”“人民”“共和国”,而搜索的时候,搜“中华共和国”,则被分为了“中华 共和国”,然而构建Query Parser构建Query Object的时候,却将它构建成了PhraseQuery—— contents:"中华 共和国" ,而非BooleanQuery——contents:中华 contents:共和国,根据PhraseQuery的解释,它有一个参数slop来表示两个词之间的距离,默认为0,也即只有在文档不但包含“中华”而且包含“共和国”并且二者相邻的时候才能返回。这就是为什么“人民共和国”可以搜出来(它构建的是PhraseQuery,但是相邻),“中华 AND 共和国”能搜索出来(它构建的是BooleanQuery),而“中华共和国”搜不出来的原因(它构建的是PhraseQuery,但不相邻)。

尝试解析Query query = parser.parse("\"中华共和国\"~1")

或者用API设置Slop为1,就能搜索出结果了。

Query query = parser.parse("中华共和国");
PhraseQuery pquery = (PhraseQuery)query;
pquery.setSlop(1);

实例:

Analyzer ca = new ChineseAnalyzer();

QueryParser parser = new QueryParser(field, ca);

Query query1 = parser.parse("人民共和国");

System.out.println("Searching for: " + query1.toString(field));

查询对象为:

query1    PhraseQuery  (id=39)   
    boost    1.0   
    field    "contents"   
    maxPosition    1   
    positions    ArrayList<E>  (id=45)   
    slop    0   
    terms    ArrayList<E>  (id=49)   
        elementData    Object[4]  (id=74)   
            [0]    Term  (id=76)   
                field    "contents"   
                text    "人民"   
            [1]    Term  (id=77)   
                field    "contents"   
                text    "共和国" 

相当于查询语句:

Searching for: "人民 共和国"

Query query2 = parser.parse("中华 AND 共和国");

System.out.println("Searching for: " + query2.toString(field));

查询对象为:

query2    BooleanQuery  (id=43)   
    boost    1.0   
    clauses    ArrayList<E>  (id=56)   
        elementData    Object[10]  (id=57)   
            [0]    BooleanClause  (id=59)   
                occur    BooleanClause$Occur  (id=62)   
                    name    "MUST"   
                query    TermQuery  (id=65)   
                    boost    1.0   
                    term    Term  (id=70)   
                        field    "contents"   
                        text    "中华"   
            [1]    BooleanClause  (id=61)   
                occur    BooleanClause$Occur  (id=62)   
                    name    "MUST"   
                query    TermQuery  (id=64)   
                    boost    1.0   
                    term    Term  (id=68)   
                        field    "contents"   
                        text    "共和国"

相当于查询语句:

Searching for: +中华 +共和国

Query query3 = parser.parse("\"中华共和国\"~1");

System.out.println("Searching for: " + query3.toString(field));

查询对象为:

query3    PhraseQuery  (id=54)   
    boost    1.0   
    field    "contents"   
    maxPosition    1   
    positions    ArrayList<E>  (id=93)   
    slop    1   
    terms    ArrayList<E>  (id=94)   
        elementData    Object[4]  (id=96)   
            [0]    Term  (id=97)   
                field    "contents"   
                text    "中华"   
            [1]    Term  (id=98)   
                field    "contents"   
                text    "共和国"

相当于查询语句:

Searching for: "中华 共和国"~1

Query query4 = parser.parse("中华共和国");

PhraseQuery pquery = (PhraseQuery)query4;

pquery.setSlop(1);

System.out.println("Searching for: " + query4.toString(field));

查询对象为:

query4    PhraseQuery  (id=55)   
    boost    1.0   
    field    "contents"   
    maxPosition    1   
    positions    ArrayList<E>  (id=102)   
    slop    1   
    terms    ArrayList<E>  (id=103)   
        elementData    Object[4]  (id=105)   
            [0]    Term  (id=107)   
                field    "contents"   
                text    "中华"   
            [1]    Term  (id=108)   
                field    "contents"   
                text    "共和国"

相当于查询语句:

Searching for: "中华 共和国"~1
分享到:
评论
3 楼 parabellum_sky 2010-07-14  
可能就是把中华共和国当作一个自定义词组来存储了。
一旦搜索引擎碰到这个词,就不会去给它分词了。
2 楼 johnsoncr 2010-04-15  
LZ分析得很好
1 楼 naughty610 2010-02-07  
是因为辞典中含有中华共和国这个词。
这样在建立索引的时候,仅仅存储了这么一个词,而不是“中华”和“共和国”这两个词。
不知道回答的对不对,等待高人

相关推荐

    lucene站内搜索

    3. **文档(Document)**: 在Lucene中,每个要搜索的信息被视为一个Document,包含多个Field,如标题、内容、作者等。 4. **字段(Field)**: Field是文档的组成部分,每个字段有特定的属性,如是否存储原始值、...

    lucene3.6 搜索例子

    1. 断点续搜:Lucene 3.6支持断点续搜,即在搜索过程中可以暂停并保存状态,之后继续搜索,这对于处理大规模数据非常有用。 2. 基于内存的缓存:为了提高搜索效率,Lucene允许在内存中缓存部分索引,如...

    Lucene全文搜索_LuceneJava全文搜索_

    总之,Lucene作为Java全文搜索的基石,提供了强大的功能和灵活性,可以帮助开发者构建高效、精准的搜索功能,无论是简单的关键词搜索还是复杂的模糊和智能查询,都能游刃有余地应对。结合"用户管理手册.docx"的学习...

    利用Lucene 实现高级搜索

    ### 利用Lucene实现高级搜索的关键知识点 #### Lucene简介 Lucene是Apache软件基金会下的一个开源全文检索库,提供了高性能的文本搜索能力。它不仅适用于网站的搜索功能,还可以用于任何需要文本搜索的应用场景,如...

    Lucene 搜索方法(多短语搜索)

    Lucene是一个高性能、全文本搜索库,它提供了一个强大的文本检索框架,使得开发者能够为他们的应用程序添加高级搜索功能。多短语搜索是指在查询中包含两个或更多相邻词的短语,它比单个词的搜索更为精确,有助于用户...

    Lucene 搜索方法(模糊搜索)

    在IT领域,搜索引擎技术是不可或缺的一部分,而Apache Lucene是一个高性能、全文本搜索库,它为开发者提供了构建自定义搜索引擎应用程序所需的所有工具。本篇我们将深入探讨如何在Lucene中实现模糊搜索,以及相关的...

    lucene 高级搜索项目

    通过以上分析,我们可以看出这个“Lucene 高级搜索项目”全面覆盖了Lucene的核心技术,从基础的索引创建到复杂的附件搜索和全文搜索,再到插件开发和Solr的使用,为学习和实践Lucene提供了丰富的素材。

    lucene 实现类似百度搜索

    **Lucene 搜索引擎实现详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会维护。...无论是在网站、应用还是大数据环境中,Lucene 都能以其高效的全文检索能力,为用户提供快速、准确的搜索结果。

    lucene实现全文搜索

    全文检索与数据库中的LIKE关键字查询不同,LIKE虽然能进行模糊匹配,但其结果可能不准确,没有相关度排序,且效率较低。 【Lucene简介】 Lucene是一个由Java编写的高性能、可扩展的全文搜索引擎库。它提供了一种...

    lucene全文搜索

    ### Lucene全文搜索知识点概述 ...无论是站内搜索还是垂直搜索,Lucene都能提供出色的表现。通过本文档的学习,你可以深入了解全文检索的基本原理、Lucene的工作机制以及如何构建自己的全文搜索应用程序。

    Lucene时间区间搜索

    总之,Lucene在C#中的时间区间搜索是通过构建和执行RangeQuery来实现的,这涉及到索引构建、查询解析、时间值的转换和比较等多个环节。合理地利用这些技术,可以有效地提升数据检索的效率和准确性。在实际应用中,还...

    Lucene 搜索方法(短语搜索)

    在信息技术领域,搜索引擎的构建是不可或缺的一部分,而Apache Lucene是一个高性能、全文本搜索库,它为开发者提供了强大的文本检索功能。本文将聚焦于Lucene中的短语搜索,一种能精确匹配多个词汇顺序的搜索方法。...

    lucene近实时搜索

    lucene 近实时搜索 很清楚的解释了关于lucene近实时搜索的代码。很值得学习

    ssh+lucene搜索实例

    Lucene可以被嵌入到各种应用中,为它们添加全文索引和搜索功能。这个库不仅包含了对文本的索引,还提供了高效的搜索算法,使得用户可以快速地查找和定位到相关的文档或内容。 在这个"ssh+lucene搜索实例"中,我们...

    基于Lucene的搜索策略研究

    ### 基于Lucene的搜索策略研究 随着信息技术的发展和社会信息化程度的加深,人们面临着海量数据的管理和检索挑战。如何高效地从大量的文档中找到所需的信息成为了亟待解决的问题。在这种背景下,Lucene作为一种开源...

    lucene 搜索中文PDF文档

    当用户输入查询时,Lucene会快速定位到包含这些查询词的文档,从而提供高效的搜索性能。 对于中文搜索,Lucene需要处理中文分词问题。中文不同于英文,单词之间没有明显的分隔符,因此需要借助中文分词器(如jieba...

    全文搜索-Lucene

    **全文搜索-Lucene** Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会维护。它提供了高效的、可扩展的全文检索功能,被广泛应用于各种 Web 应用、内容管理系统以及数据挖掘项目中。Lucene 实现了索引和...

    Lucene5学习之拼音搜索

    《深入探索Lucene5:拼音搜索的实现与应用》 Lucene是一个强大的全文搜索引擎库,广泛应用于各种信息检索系统中。在Lucene5版本中,它不仅提供了基础的文本搜索功能,还支持了拼音搜索,这极大地提高了中文搜索的...

    Lucene.Heritrix:开发自己的搜索引擎(第2版)

    《Lucene.Heritrix:开发自己的搜索引擎(第2版)》是一本深入探讨如何构建搜索引擎的专业书籍,作者是邱哲。这本书详细介绍了利用Apache Lucene和Heritrix这两个强大的开源工具来创建自定义搜索引擎的技术和策略。 ...

Global site tag (gtag.js) - Google Analytics