文章来自:http://myzhangjl.blog.sohu.com/95911870.html
这几天看Lucene,看到检索那块,被PhraseQuery折腾了一阵,那本《Lucene In
Action》里的代码版本太旧了,也不知是翻译的问题还是我的理解问题,总之在看PhraseQuery的设置slop时费了半天劲,不过,总算是搞明
白了,发个帖子来分享一下:
所谓PhraseQuery,就是通过短语来检索,比如我想查“big
car”这个短语,那么如果待匹配的document的指定项里包含了"big
car"这个短语,这个document就算匹配成功。可如果待匹配的句子里包含的是“big black
car”,那么就无法匹配成功了,如果也想让这个匹配,就需要设定slop,先给出slop的概念:slop是指两个项的位置之间允许的最大间隔距离,下
面我举例来解释:
我的待匹配的句子是:the quick brown fox jumped over the lazy dog.
例1:
如果我想用“quick fox
”来匹配出上面的句子,我发现原句里是quick [brown] fox
,就是说和我的“quick fox
”中间相差了一个单词的距离,所以,我这里把slop设为1,表示quick
和fox
这两项之间最大可以允许有一个单词的间隔,这样所有“quick [***] fox
”就都可以被匹配出来了。
例2:
如果我想用“fox quick
”来匹配出上面的句子,这也是可以的,不过比例1要麻烦,我们需要看把“fox quick
”怎么移动能形成“quick [***] fox
”,如下表所示,把fox
向右移动3次即可:
|
fox |
quick |
|
|
1 |
|
fox|quick |
|
|
2 |
|
quick |
fox |
|
3 |
|
quick |
|
fox |
例3:
如果我想用“lazy jumped quick
”该如何匹配上面的句子呢?这个比例2还要麻烦,我们要考虑3个单词,不管多少个单词,slop表示的是间隔的最大距离,详细起见,我们分别来看每种组合:(我的待匹配的句子是:the quick brown fox jumped over the lazy dog.
)
-
lazy jumped:
原句是jumped [over] [the] lazy
,就是说它们两个之间间隔了2个词,如下所示:需要把lazy
向右移动4位
|
lazy |
jumped |
|
|
|
1 |
|
lazy|jumped |
|
|
|
2 |
|
jumped |
lazy |
|
|
3 |
|
jumped |
|
lazy |
|
4 |
|
jumped |
|
|
lazy |
- lazy jumped quick:
我们主要看lazy
和quick
,但是由于jumped
是在中间,所以移动的时候还是要把jumped
考虑在内,原句里lazy
和quick
的关系是:quick [brown] [fox] [jumped] [over] [the] lazy ,quick lazy
中间间隔了5个词,所以如下图所示,把lazy向右移动8次
|
lazy |
jumped
|
quick |
|
|
|
|
|
|
1
|
|
lazy|jumped
|
quick
|
|
|
|
|
|
|
2
|
|
jumped
|
lazy|quick
|
|
|
|
|
|
|
3
|
|
jumped
|
quick
|
lazy
|
|
|
|
|
|
4
|
|
jumped
|
quick
|
|
lazy
|
|
|
|
|
5
|
|
jumped
|
quick
|
|
|
lazy
|
|
|
|
6
|
|
jumped
|
quick
|
|
|
|
lazy
|
|
|
7
|
|
jumped
|
quick
|
|
|
|
|
lazy
|
|
8
|
|
jumped
|
quick
|
|
|
|
|
|
lazy |
- 最后是jumped qucik
,这里不详细画表格了,大家可以自己试试,应该是把jumped向右移动4次。
综合以上3种情况,所以我们需要把slop设为8才令“lazy jumped quick
”可以匹配到原句。
分享到:
相关推荐
Lucene中的SpanQuery和PhraseQuery详解 Lucene是一个功能强大的搜索引擎库,提供了多种查询方式,其中SpanQuery和PhraseQuery是两个重要的查询类型。本文将详细介绍SpanQuery和PhraseQuery的使用和区别。 一、...
- `Query`:代表用户输入的搜索条件,如TermQuery、BooleanQuery、PhraseQuery等。 - `ScoreDoc`和`TopDocs`:用于存储搜索结果及其评分,TopDocs包含匹配的文档总数和最高评分的文档集合。 - `Highlighter`:...
Lucene支持多种查询类型,如TermQuery、PhraseQuery、BooleanQuery等,可以组合使用以满足复杂查询需求。 **6. Lucene 插件和扩展** `05_lucene_plugin`可能讨论了Lucene的扩展机制。Lucene允许开发人员编写自定义...
Lucene提供了一系列高级功能,如`BooleanQuery`、`PhraseQuery`、`WildcardQuery`等,可以根据需求灵活使用。 通过学习和实践这个LuceneDemo,你可以对Lucene有一个初步的认识,了解如何创建、索引和搜索文档。随着...
2. **Lucene-Queries**: 提供了高级查询结构,例如BooleanQuery、PhraseQuery、WildcardQuery等。 3. **Lucene-Suggest**: 该模块提供了自动补全和建议功能,用于提升用户体验。 4. **Lucene-Spatial**: 支持地理...
Lucene提供了多种查询类型,如TermQuery、PhraseQuery、WildcardQuery等,可以根据需求选择合适的查询方式。接着,使用`IndexSearcher`执行查询,并通过`TopDocs`获取排名最高的搜索结果。 **4. 高级搜索特性** ...
2. **查询优化**: 使用过滤器(Filter)、布尔查询(BooleanQuery)和短语查询(PhraseQuery)等提高查询效率。 3. **缓存策略**: 利用Lucene的缓存机制,如BitSetDocValues缓存,提升搜索速度。 4. **结果相关性*...
5. **查询构造**:学习使用QueryParser创建标准查询,以及如何使用TermQuery、BooleanQuery、WildcardQuery、PhraseQuery等不同类型的查询来满足复杂搜索需求。 6. **搜索执行**:通过Searcher对象执行查询,获取...
在Lucene 5中,支持多种查询类型,如TermQuery、PhraseQuery、BooleanQuery等,以及复杂的组合查询。同时,通过合理设置索引字段,如使用ngram索引、倒排索引等,可以显著提升搜索速度。 六、性能调优 Lucene提供了...
3. **查询类型**:Lucene支持多种查询类型,包括布尔查询(BooleanQuery)、短语查询(PhraseQuery)、范围查询(RangeQuery)等,可以根据实际需求构造复杂的查询表达式。 4. **排序与评分**:Lucene不仅可以找到...
4. **查询与排序**:Lucene支持多种查询类型,如标准查询解析器(StandardQueryParser)、短语查询(PhraseQuery)、范围查询(RangeQuery)等。同时,我们还可以使用评分函数(ScoreFunction)和自定义比较器...
总结一下,Lucene的短语搜索通过`PhraseQuery`类提供了一种强大的工具,能够精确匹配文档中词汇的顺序。通过对`DemoData.java`和`PhraseQueryDemo.java`的分析,我们可以了解到如何构建短语查询,设置位置偏移量,...
3. **查询解析与执行**:用户输入的查询字符串会被解析成查询对象,Lucene提供多种查询类型,如布尔查询(BooleanQuery)、短语查询(PhraseQuery)和模糊查询(FuzzyQuery)。查询执行过程中,Lucene会根据倒排索引...
5. **查询处理**:讨论各种查询语法和查询对象,如TermQuery、BooleanQuery、PhraseQuery等,以及如何编写复杂的查询表达式。 6. **搜索算法**:解释TF-IDF、BM25等评分算法,以及如何调整这些算法以满足特定的搜索...
- 表示用户查询的抽象类,例如TermQuery、BooleanQuery、PhraseQuery等。 7. **Searcher**: - 包括IndexSearcher,用于执行查询,返回匹配的Document列表。 8. **ScoreDoc和TopDocs**: - **ScoreDoc**:包含...
搜索方面,`IndexSearcher`类是执行查询的主要接口,它可以执行各种类型的查询,如TermQuery、PhraseQuery、BooleanQuery等。`QueryParser`类则提供了一种方便的方式来构造复杂的布尔查询。搜索结果通过`Hits`对象...
- **Query**:用户输入的搜索条件被转化为Query对象,常见的有TermQuery(单个词查询)、BooleanQuery(布尔逻辑组合查询)和PhraseQuery(短语查询)等。 - **TF-IDF**:Lucene使用TF-IDF(词频-逆文档频率)算法...
`lucene-queries-4.10.3.CHM`详细阐述了Lucene的各种查询类型和构造方法,如TermQuery、BooleanQuery、PhraseQuery等,以及如何组合这些查询以实现复杂的检索策略。 `lucene-spatial-4.10.3.CHM`专注于地理空间搜索...
此外,还可以手动构造复杂的查询,如布尔查询、短语查询、范围查询等,通过`BooleanQuery`, `TermQuery`, `PhraseQuery`等类实现。 5. **搜索过程**:`Searcher`类负责执行搜索操作,其中`IndexSearcher`是最常用的...
笔记中可能会介绍各种查询类型,如TermQuery、WildcardQuery和PhraseQuery,并讲解评分机制。 笔记(五)至(八)可能涵盖高级特性,比如多字段搜索、布尔查询、短语匹配、近似搜索以及如何使用SpanQuery进行更精确的...