2

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

2 回答 2

4

这一切都与 Lucene 有关:索引字段是您要搜索的字段。当您索引一个字段时,您可以决定是否要分析它。这意味着您可以按原样对其进行索引,而无需对其进行标记或应用任何标记过滤器。否则,您可以对其应用分析器。Lucene 有一些开箱即用的分析器,在 elasticsearch 中也有。分析器由标记器和标记过滤器列表组成。分词器确定您如何以不同的术语拆分字段内容。使用令牌过滤器,您可以过滤这些术语和/或修改它们。

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

有时(实际上经常如此),您需要创建自己的分析器,将标记器和要使用的标记过滤器结合起来。您可以在定义自定义分析器的设置中的弹性搜索中执行此操作。

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

于 2012-09-26T08:38:25.797 回答
1
  1. 未分析意味着该字段不使用分析器管道(标记器、过滤器等)。该字段仍可搜索。

  2. indexes是你如何告诉轮胎一个字段 - 它只是用于添加新字段的 dsl 关键字(如column在 activerecord 迁移中)。elasticsearch 中的所有内容都已编入索引

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

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

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

  6. 我不认为这是可以回答的。这取决于您要搜索的数据是什么

于 2012-09-26T08:18:58.730 回答