发布于 2016-02-29 14:41:53 | 272 次阅读 | 评论: 0 | 来源: 网络整理
对于准确值,你需要使用过滤器。过滤器的重要性在于它们非常的快。它们不计算相关性(避过所有计分阶段)而且很容易被缓存。我们今后再来讨论过滤器的性能优势【过滤器缓存】,现在,请先记住尽可能多的使用过滤器。
term
过滤器我们下面将介绍 term
过滤器,首先因为你可能经常会用到它,这个过滤器旨在处理数字,布尔值,日期,和文本。
我们来看一下例子,一些产品最初用数字来索引,包含两个字段 price
和 productID
:
POST /my_store/products/_bulk
{ "index": { "_id": 1 }}
{ "price" : 10, "productID" : "XHDK-A-1293-#fJ3" }
{ "index": { "_id": 2 }}
{ "price" : 20, "productID" : "KDKE-B-9947-#kL5" }
{ "index": { "_id": 3 }}
{ "price" : 30, "productID" : "JODL-X-1937-#pV7" }
{ "index": { "_id": 4 }}
{ "price" : 30, "productID" : "QQPX-R-3956-#aD8" }
我们的目标是找出特定价格的产品。假如你有关系型数据库背景,可能用 SQL 来表现这次查询比较熟悉,它看起来像这样:
SELECT document
FROM products
WHERE price = 20
在 Elasticsearch DSL 中,我们使用 term
过滤器来实现同样的事。term
过滤器会查找我们设定的准确值。term
过滤器本身很简单,它接受一个字段名和我们希望查找的值:
{
"term" : {
"price" : 20
}
}
term
过滤器本身并不能起作用。像在【查询 DSL】中介绍的一样,搜索 API 需要得到一个查询语句
,而不是一个 过滤器
。为了使用 term
过滤器,我们需要将它包含在一个过滤查询语句中:
GET /my_store/products/_search
{
"query" : {
"filtered" : { <1>
"query" : {
"match_all" : {} <2>
},
"filter" : {
"term" : { <3>
"price" : 20
}
}
}
}
}
`filtered` 查询同时接受接受 `query` 与 `filter`。 `match_all` 用来匹配所有文档,这是默认行为,所以在以后的例子中我们将省略掉 `query` 部分。 这是我们上面见过的 `term` 过滤器。注意它在 `filter` 分句中的位置。 执行之后,你将得到预期的搜索结果:只能文档 2 被返回了(因为只有 `2` 的价格是 `20`): ```json "hits" : [ { "_index" : "my_store", "_type" : "products", "_id" : "2", "_score" : 1.0, "_source" : { "price" : 20, "productID" : "KDKE-B-9947-#kL5" } } ] ``` 过滤器不会执行计分和计算相关性。分值由 `match_all` 查询产生,所有文档一视同仁,所有每个结果的分值都是 `1` #### 用于文本的 `term` 过滤器 像我们在开头提到的,`term` 过滤器可以像匹配数字一样轻松的匹配字符串。让我们通过特定 UPC 标识码来找出产品,而不是通过价格。如果用 SQL 来实现,我们可能会使用下面的查询: ```sql SELECT product FROM products WHERE productID = "XHDK-A-1293-#fJ3" ``` 转到查询 DSL,我们用 `term` 过滤器来构造一个类似的查询: ```json GET /my_store/products/_search { "query" : { "filtered" : { "filter" : { "term" : { "productID" : "XHDK-A-1293-#fJ3" } } } } } ``` 有点出乎意料:我们没有得到任何结果值!为什么呢?问题不在于 `term` 查询;而在于数据被索引的方式。如果我们使用 `analyze` API,我们可以看到 UPC 被分解成短小的表征: ```json GET /my_store/_analyze?field=productID XHDK-A-1293-#fJ3 ``` ```json { "tokens" : [ { "token" : "xhdk", "start_offset" : 0, "end_offset" : 4, "type" : "