【问题标题】:Several very specific elasticsearch questions几个非常具体的elasticsearch问题
【发布时间】:2012-09-26 23:23:24
【问题描述】:

我有几个关于 Rails + Tire + ElasticSearch 的非常具体的问题。

我看过 Railscast 关于它的内容,也阅读了很多文档,但老实说,这超出了我的想象。我希望有人能帮助我理解我无法完全掌握的细节。

这是我模型中的 Resource.rb 弹性搜索部分:

  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. 如果我的category.name 存储为复数形式,例如“books”、“movies”、“tapes”,我如何告诉分析器根据单数和复数来查看这个词。搜索“电影”无效,但“电影”有效
  5. 当我删除 load: true 时,我的整个网站都会中断。他在railscast中回顾了这一点,但只是片刻。这是否意味着我需要将每个属性(和关联)移动到映射中,并将其更改为 :not_analyzed? (我刚刚意识到......也许我只是回答了我自己的问题 #1!)。
  6. 一般来说,哪种类型的数据最适合 OR,哪种数据最适合 AND?就获得更多结果而言,我正在考虑或似乎更宽容

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,很有帮助!你能扩展最后一句话吗?这是我的另一个问题,比上面的这个问题更难:stackoverflow.com/questions/12593405/…
    • 很高兴我的回答有帮助!我在最后一句话中添加了解释。
    【解决方案2】:
    1. 未分析表示该字段不使用分析器管道(标记器、过滤器等)。该字段仍可搜索。

    2. indexes 是您告诉轮胎有关字段的方式 - 它只是用于添加新字段的 dsl 关键字(如活动记录迁移中的column)。 elasticsearch 中的所有内容都有索引

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 2016-06-02
      • 2017-12-08
      • 1970-01-01
      相关资源
      最近更新 更多