我正在尝试优化我的弹性搜索方案。
我有一个 URL 字段 - 我不想查询或过滤它,只是检索它。
我的理解是,定义为的字段"index":"no"
没有被索引,但仍然存储在索引中。(参见http://www.slideshare.net/nitin_stephens/lucene-basics中的幻灯片 5 )这应该与 Lucene UnIndexed 匹配,对吧?
这让我很困惑,有没有办法存储一些字段,而不是仅仅占用它们的内容更多的存储空间,并且不妨碍其他字段的索引?
我错过了什么?
我正在尝试优化我的弹性搜索方案。
我有一个 URL 字段 - 我不想查询或过滤它,只是检索它。
我的理解是,定义为的字段"index":"no"
没有被索引,但仍然存储在索引中。(参见http://www.slideshare.net/nitin_stephens/lucene-basics中的幻灯片 5 )这应该与 Lucene UnIndexed 匹配,对吧?
这让我很困惑,有没有办法存储一些字段,而不是仅仅占用它们的内容更多的存储空间,并且不妨碍其他字段的索引?
我错过了什么?
我是在堆栈交换上发帖的新手,但相信我可以提供一点帮助!
这里有几个考虑:
由于您不想做额外的工作,您应该设置"index": "no"
. 这意味着该字段将不会通过任何标记器和过滤器运行。
此外,将查询定向到特定字段时将无法搜索:(无命中)
"query": {
"term": {
"url": "http://www.domain.com/exact/url/that/was/sent/to/elasticsearch"
}
}
*这里的“url”是字段名。
但是,该字段仍可在该_all
字段中搜索:(可能会成功)
"query": {
"term": {
"_all": "http://www.domain.com/exact/url/that/was/sent/to/elasticsearch"
}
}
_all
场地默认情况下,每个字段都放在_all
字段中。设置"include_in_all": "false"
停止。这可能不是您的问题,因为您不太可能_all
错误地搜索带有 URL 的字段。
我正在使用将国家/地区存储为 2 个字母代码的模式,例如:“NO”表示挪威,并且有人可能会使用“NO”对 all 字段进行搜索,因此我确保设置"include_in_all": "false"
.
注意:您未明确指定字段的任何查询都将针对该_all
字段执行。
默认情况下,elasticsearch 将存储您的整个文档(未分析,在您发送时),并将在命中_source
字段中返回给您。如果您将其关闭(如果您的 elasticsearch 数据库可能变得越来越大?)那么您需要明确设置"store": "yes"
为单独存储字段。(需要注意的一件事是store
需要yes
或no
不需要true
或false
- 它让我绊倒了!)
注意:如果您这样做,您将需要明确请求您想要返回给您的字段。例如:
curl -XGET http://path/index_name/type_name/id?fields=url,another_field
我会留下 elasticsearch 来存储您的整个文档(作为默认值)并使用以下映射。
"type_name": {
"properties": {
"url": {
"type": "string",
"index": "no",
"include_in_all": "false"
},
// other fields' mappings
}
}
来源:弹性搜索文档
有两种方法可以将数据输入到索引中。索引和存储。索引一条数据意味着它被标记化,并被放入倒排索引中,并且可以被搜索到。存储数据意味着它没有被标记化、分析或任何东西,也没有被添加到倒排索引中。它以全文形式存储在一个完全独立的区域中。无法对其进行搜索,但可以通过其文档 ID 以原始形式对其进行检索。
典型的 Lucene 查询过程是查询索引数据,并获取匹配文档的返回 Document ID,然后使用这些文档 ID 检索这些文档的存储数据,并将其显示给用户。
已编入索引但未存储的数据是可搜索的,但无法以其原始形式检索。
一旦找到命中,就可以检索已存储但未编入索引的数据,但不可搜索。
可以搜索或检索索引和存储的数据。
两者都不是的数据根本无法添加到索引中。
这在Lucene FAQ中有一些介绍。
您正在寻找'index' => 'not_analyzed'
映射选项。
此外,如果您使用_source
,则不必指定store => false
选项。