在今天的这个教程中,我们来着重讲解一下如何使用Elasticsearch中的copy来提高搜索的效率。比如在我们的搜索中,经常我们会遇到如下的文档:
1 | { |
在这里,我们可以看到在这个文档中,我们有这样的几个字段:
1 | "city" : "北京", |
它们是非常相关的。我们在想是不是可以把它们综合成一个字段,这样可以方便我们的搜索。假如我们要经常对这三个字段进行搜索,那么一种方法我们可以在must子句中使用should子句运行bool查询。这种方法写起来比较麻烦。有没有一种更好的方法呢?
我们其实可以使用Elasticsearch所提供的copy_to来提高我们的搜索效率。我们可以首先把我们的index的mapping设置成如下的项(这里假设我们使用的是一个叫做twitter的index)。
1 | PUT twitter |
在这里,我们特别注意如下的这个部分:
1 | "city": { |
我们把city, country及province三个项合并成为一个项region,但是这个region并不存在于我们文档的source里。当我们这么定义我们的mapping的话,在文档被索引之后,有一个新的region项可以供我们进行搜索。
我们可以采用如下的数据来进行展示:
1 | POST _bulk |
在Kibnana中执行上面的语句,它将为我们生产我们的twitter索引。同时我们可以通过如下的语句来查询我们的mapping:
我们可以看到twitter的mapping中有一个新的被称作为region的项。它将为我们的搜索带来方便。
那么假如我们想搜索country:中国,province:北京 这样的记录的话,我们可以只写如下的一条语句就可以了:
1 | GET twitter/_search |
下面显示的是搜索的结果:
1 | { |
这样我们只对一个region进行操作就可以了,否则我们需要针对country, city及province分别进行搜索。
如何查看copy_to的内容
在之前的mapping中,我们对region字段加入了如下的一个属性:
1 | "region": { |
这里的store属性为true,那么我们可以通过如下的命令来查看文档的region的内容:
1 | GET twitter/_doc/1?stored_fields=region |
那么它显示的内容如下:
1 | { |
如果你想了解更多关于Elastic Stack,请参阅文章“Elasticsearch简介”