elasticsearch 多词短语位置匹配查询
2017-02-23 09:02
211 查看
短语匹配
就像 match查询对于标准全文检索是一种最常用的查询一样,当你想找到彼此邻近搜索词的查询方法时,就会想到
match_phrase查询。
GET /my_index/my_type/_search { "query": { "match_phrase": { "title": "quick brown fox" } } }
类似
match查询,
match_phrase查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,但只保留那些包含 全部 搜索词项,且 位置 与搜索词项相同的文档。
比如对于
quick fox的短语搜索可能不会匹配到任何文档,因为没有文档包含的
quick词之后紧跟着
fox。
Tip | match_phrase查询同样可写成一种类型为 phrase的 match查询: "match": { "title": { "query": "quick brown fox", "type": "phrase" } } |
词项的位置
当一个字符串被分词后,这个分析器不但会返回一个词项列表,而且还会返回各词项在原始字符串中的 位置 或者顺序关系:GET /_analyze?analyzer=standard Quick brown fox
返回信息如下:
{ "tokens": [ { "token": "quick", "start_offset": 0, "end_offset": 5, "type": "<ALPHANUM>", "position": 1 (1) }, { "token": "brown", "start_offset": 6, "end_offset": 11, "type": "<ALPHANUM>", "position": 2 (1) }, { "token": "fox", "start_offset": 12, "end_offset": 15, "type": "<ALPHANUM>", "position": 3 (1) } ] }
position代表各词项在原始字符串中的位置。
位置信息可以被存储在倒排索引中,因此
match_phrase查询这类对词语位置敏感的查询, 就可以利用位置信息去匹配包含所有查询词项,且各词项顺序也与我们搜索指定一致的文档,中间不夹杂其他词项。
什么是短语
一个被认定为和短语 quick brown fox匹配的文档,必须满足以下这些要求:
quick、
brown和
fox需要全部出现在域中。
brown的位置应该比
quick的位置大
1。
fox的位置应该比
quick的位置大
2。
如果以上任何一个选项不成立,则该文档不能认定为匹配。
Tip | 本质上来讲,match_phrase查询是利用一种低级别的 span查询族(query family)去做词语位置敏感的匹配。 Span 查询是一种词项级别的查询,所以它们没有分词阶段;它们只对指定的词项进行精确搜索。 值得庆幸的是, match_phrase查询已经足够优秀,大多数人是不会直接使用 span查询。 然而,在一些专业领域,例如专利检索,还是会采用这种低级别查询去执行非常具体而又精心构造的位置搜索。 |
相关文章推荐
- ElasticSearch查询 第四篇:匹配查询(Match)
- 使用combobox做模糊查询、匹配时,改从开始位置匹配为从任意位置匹配
- Elasticsearch - 短语匹配(match_phrase)以及slop参数
- [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles
- Elasticsearch - 短语匹配(match_phrase)以及slop参数
- [Elasticsearch] 部分匹配 (一) - 前缀查询
- [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles
- [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop参数
- elasticsearch中的精准文本位置匹配
- 2 Elasticsearch全文检索和匹配查询
- ElasticsearchTemplate的详细使用,完成多条件查询、匹配度查询等
- [Elasticsearch] 部分匹配 (三) - 查询期间的即时搜索
- elasticsearch 短语查询(match_phrase)
- [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop参数
- ElasticsearchTemplate的详细使用,完成多条件查询、匹配度查询等
- [Elasticsearch] 部分匹配 (一) - 前缀查询
- [Elasticsearch] 部分匹配 (一)ALL - 前缀查询
- Elasticsearch使用filter进行匹配关系and,or,not,range查询
- elasticsearch查询内容精确匹配
- [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles