几个非常具体的弹性研究问题

时间:2012-09-25 23:39:09

标签: ruby-on-rails ruby lucene elasticsearch tire

我有一些关于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
  1. 'not_analyzed'是什么意思?在我正在阅读的许多教程中,他们使用了这个。如果没有进行分析,为什么它会包含在mapping do
  2. 使用索引的目的是什么。例如,像indexes :id, type: 'integer'这样的东西。为什么需要对整数进行索引,这有助于提高性能吗?
  3. 如何修改分析器的URL以使其更好用?例如,如果将其存储为http://www.dropbox.com,则搜索dropbox.com找不到结果,但www.dropbox.com会找到结果。我尝试过粘贴所有不同的分析器,但没有一个真正适用于URL
  4. 如果我的category.name存储为复数,例如'books','movies','tapes',我怎么能告诉分析器基于单数和复数来查看这个单词。搜索“电影”不起作用,但“电影”确实有用
  5. 当我删除load: true时,我的整个网站都会中断。他在轨道广播中重复了这一点,但只是片刻。这是否意味着我需要将每个属性(和关联)移动到映射中,并将其更改为:not_analyzed? (我刚刚意识到......也许我只回答了我自己的问题#1!)。
  6. 一般来说,什么类型的数据最适合OR,哪种最适合AND?对于获得更多结果,我在想或似乎更宽容

2 个答案:

答案 0 :(得分:4)

关于Lucene的全部内容:索引字段是您要搜索的字段。索引字段时,您可以决定是否要对其进行分析。这意味着您可以按原样对其进行索引,而无需对其进行标记或应用任何标记过滤器。否则,您可以应用分析仪。有一些分析仪可以直接使用Lucene,也可以在弹性搜索中使用。分析器由标记器和标记过滤器列表组成。标记器确定如何以不同的术语分割字段内容。使用令牌过滤器,您可以过滤这些术语和/或修改它们。

例如,最常见的标记化方法是使用WhitespaceTokenizer。然后,您可以应用词干,例如,以索引术语的词干。例如,running变为run,复数词变为单数。

有时(实际上经常),您需要创建自己的分析器,将分析器和您要使用的令牌过滤器组合在一起。您可以在定义自定义分析器的settings中的elasticsearch中执行此操作。

有时你不想在lucene中索引字段,因为你不打算搜索它们,但是你确实希望存储它们。存储的字段是您要在搜索结果中返回的字段。事实上,lucene可以搜索索引字段,但只能返回存储的字段。幸运的是,elasticsearch帮助我们存储整个_source文档,以便我们返回默认情况下编入索引的整个文档。如果您不想将源存储在elasticsearch中,则可以始终禁用此功能。否则,如果您不希望在查询时备份整个源,则只需指定要返回的fields列表即可。如果它们已存储(您可以在映射中配置它,每个字段的默认值已编入索引但未存储),则会立即返回它们,否则它们将从源本身中提取(如果未禁用)。如果你有大文件,我建议配置你想要的字段,否则你每次都会收回整个来源。

答案 1 :(得分:1)

  1. 未分析表示该字段不使用分析器管道(标记器,过滤器等)。该领域仍然是可搜索的。

  2. indexes就是你如何讲述一个字段 - 它只是用于添加新字段的dsl关键字(如在活动记录迁移中的column)。弹性搜索中的所有内容都已编入索引

  3. 您可能需要编写自己的分析器。这可以通过将现有的标记器,过滤器等串联在一起作为索引设置来完成。

  4. 使用elasticsearch提供的一个词干分析器作为其过滤器之一设置分析器

  5. 我看到你为此创建了一个单独的问题

  6. 我认为这不负责任。这取决于你正在搜索的数据是什么