3.4.2.17.3.全文搜索/精确搜索
创作人:金端
审稿人:欧阳楚才
在 ES 的文本搜索中,精确搜索和全文搜索是使用 ES 进行搜索时基本且常见的一个话题。
这里先重申一下 keyword 和 text 类型的概念:
l keyword:建立索引不分词,可以用来过滤、排序和聚合。可以满足电子邮箱地址、主机名、状态码、邮政编码和标签等数据的要求。
l text:存储数据默认进行分词,分词机制之后 ES 允许检索到该文本切分而成的词语,但是text类型的数据不能用来过滤、排序和聚合等操作。用来索引长文本,例如电子邮件主体部分或者一款产品的介绍。
在精确搜索和全文搜索的内容中,主要用于存储文本的字段类型就是 keyword 和 text。
抛开复杂的理论,我们先来了解一下 ES 对文本内容搜索基本的两个方法: term 和 match 。
一、初识 term 与 match
先创建一个测试索引并放入两条数据。
PUT my-index-000001 { "mappings": { "properties": { "full_text": { "type": "text" } } } } PUT my-index-000001/_doc/1 { "full_text": "quick brown foxes!" } PUT my-index-000001/_doc/2 { "full_text": "Quick Foxes Brown !" }
我们先使用 term 查询搜索一下关键词 foxes 。
GET my-index-000001/_search?pretty { "query": { "term": { "full_text": "foxes" } } }
返回结果为:
{ ··· "hits" : [ { "_index" : "my-index-000001", "_type" : "_doc", "_id" : "1", "_score" : 0.18232156, "_source" : { "full_text" : "quick brown foxes!" } }, { "_index" : "my-index-000001", "_type" : "_doc", "_id" : "2", "_score" : 0.18232156, "_source" : { "full_text" : "Quick Foxes Brown !" } } ] } }
可以发现两条记录都命中了。我们再试试使用 foxes 后添加一个感叹号形成 "foxes!" 搜索一下。
GET my-index-000001/_search?pretty { "query": { "term": { "full_text": "foxes!" } } }
返回结果为空。
{ ··· "hits" : [ ] } }
我们再使用 "brown foxes" 这两个关键词试验一下。
GET my-index-000001/_search?pretty { "query": { "term": { "full_text": "brown foxes" } } }
会发现返回结果也是为空。
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.3.全文搜索/精确搜索(2) https://developer.aliyun.com/article/1229942