我有一些关于Rails + Tire + ElasticSearch的非常具体的问题。
我已经看过关于它的Railscast,我已经阅读了很多文档,但说实话,它已经超出了我的想象。我希望有人帮助我理解我无法理解的细节。
这是我模型中的Resource.rb elasticsearch部分:
include Tire::Model::Search
include Tire::Model::Callbacks
mapping do
indexes :url
indexes :title, :boost => 3
indexes :description, :boost => 2
indexes :category, :boost => 1.5, type: 'object',
properties: {
name: { type: 'multi_field',
fields: { name: { type: 'string', analyzer: 'keyword' } } } }
indexes :user, type: 'object',
properties: {
username: { type: 'multi_field',
fields: { username: { type: 'string', analyzer: 'keyword' } } } }
end
def self.elasticsearch(params)
tire.search(load: true, page: params[:page], per_page: 20) do
query { string params[:e], default_operator: "OR" } if params[:e].present?
end
end
def to_indexed_json
to_json( include: { user: { only: [:username] },
category: { only: [:name] }
} )
end
mapping do
?indexes :id, type: 'integer'
这样的东西。为什么需要对整数进行索引,这有助于提高性能吗?http://www.dropbox.com
,则搜索dropbox.com
找不到结果,但www.dropbox.com
会找到结果。我尝试过粘贴所有不同的分析器,但没有一个真正适用于URL category.name
存储为复数,例如'books','movies','tapes',我怎么能告诉分析器基于单数和复数来查看这个单词。搜索“电影”不起作用,但“电影”确实有用load: true
时,我的整个网站都会中断。他在轨道广播中重复了这一点,但只是片刻。这是否意味着我需要将每个属性(和关联)移动到映射中,并将其更改为:not_analyzed? (我刚刚意识到......也许我只回答了我自己的问题#1!)。答案 0 :(得分:4)
关于Lucene的全部内容:索引字段是您要搜索的字段。索引字段时,您可以决定是否要对其进行分析。这意味着您可以按原样对其进行索引,而无需对其进行标记或应用任何标记过滤器。否则,您可以应用分析仪。有一些分析仪可以直接使用Lucene,也可以在弹性搜索中使用。分析器由标记器和标记过滤器列表组成。标记器确定如何以不同的术语分割字段内容。使用令牌过滤器,您可以过滤这些术语和/或修改它们。
例如,最常见的标记化方法是使用WhitespaceTokenizer。然后,您可以应用词干,例如,以索引术语的词干。例如,running
变为run
,复数词变为单数。
有时(实际上经常),您需要创建自己的分析器,将分析器和您要使用的令牌过滤器组合在一起。您可以在定义自定义分析器的settings中的elasticsearch中执行此操作。
有时你不想在lucene中索引字段,因为你不打算搜索它们,但是你确实希望存储它们。存储的字段是您要在搜索结果中返回的字段。事实上,lucene可以搜索索引字段,但只能返回存储的字段。幸运的是,elasticsearch帮助我们存储整个_source文档,以便我们返回默认情况下编入索引的整个文档。如果您不想将源存储在elasticsearch中,则可以始终禁用此功能。否则,如果您不希望在查询时备份整个源,则只需指定要返回的fields列表即可。如果它们已存储(您可以在映射中配置它,每个字段的默认值已编入索引但未存储),则会立即返回它们,否则它们将从源本身中提取(如果未禁用)。如果你有大文件,我建议配置你想要的字段,否则你每次都会收回整个来源。
答案 1 :(得分:1)
未分析表示该字段不使用分析器管道(标记器,过滤器等)。该领域仍然是可搜索的。
indexes
就是你如何讲述一个字段 - 它只是用于添加新字段的dsl关键字(如在活动记录迁移中的column
)。弹性搜索中的所有内容都已编入索引
您可能需要编写自己的分析器。这可以通过将现有的标记器,过滤器等串联在一起作为索引设置来完成。
使用elasticsearch提供的一个词干分析器作为其过滤器之一设置分析器
我看到你为此创建了一个单独的问题
我认为这不负责任。这取决于你正在搜索的数据是什么