not_indexed字段存储在索引中

时间:2013-06-04 07:01:33

标签: lucene elasticsearch

我正在尝试优化我的弹性搜索方案。

我有一个字段,这是一个网址 - 我不想查询或过滤它,只是检索它。

我的理解是,定义为"index":"no"的字段未编入索引,但仍存储在索引中。 (见http://www.slideshare.net/nitin_stephens/lucene-basics中的幻灯片5) 这应该与Lucene UnIndexed匹配,对吧?

这让我感到困惑,有没有办法存储一些字段,没有它们占用的内存比简单的内容更多,而且不会妨碍其他字段的索引?

我错过了什么?

3 个答案:

答案 0 :(得分:15)

我刚接触堆栈交换,但相信我可以帮助一下!

这里有一些注意事项:

分析

由于您不想做额外的工作,您应该设置"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"以停止该操作。这可能不是您的问题,因为您不太可能错误地使用URL搜索_all字段。

我正在使用一个模式,其中国家/地区存储为2个字母代码,例如:“NO”表示挪威,并且可能有人可能会使用“NO”对所有字段进行搜索,因此我确保设置"include_in_all": "false"

注意:任何未明确指定字段的查询都将针对_all字段执行。

贮藏

默认情况下,elasticsearch会存储您的整个文档(在您发送时未经分析),这将在点击的_source字段中返回给您。如果你关闭它(如果你的elasticsearch数据库可能变得很大?)那么你需要明确地设置"store": "yes"来单独存储字段。 (需要注意的一点是,store需要yesno而不是truefalse - 它会让我绊倒!)

注意:如果您这样做,您将需要明确请求返回给您的字段。 e.g:

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
    }
}

来源:elasticsearch documentation

答案 1 :(得分:4)

有两种方法可以将数据输入索引。索引和存储。索引一段数据意味着它被标记化,并被放置在倒排索引中,并且可以被搜索。存储数据意味着它不被标记化,分析或任何东西,并且不会被添加到倒排索引中。它以完整的文本形式存储在一个完全独立的区域中。它不能被搜索,但可以通过它的文档ID以原始形式检索。

典型的Lucene查询过程是查询索引数据,获取匹配文档的后备文档ID,然后使用这些文档ID检索这些文档的存储数据,并将其显示给用户。

索引但未存储的数据是可搜索的,但无法以原始格式检索。

存储但未编入索引的数据可以在找到匹配后检索,但不可搜索。

可以搜索或检索索引和存储的数据。

两者都不能将数据添加到索引中。

Lucene FAQ中有一点介绍。

答案 2 :(得分:1)

您正在寻找'index' => 'not_analyzed'映射选项。

此外,如果您使用_source,则无需指定store => false选项。