轮胎搜索返回条款的第一个字母

时间:2013-11-04 22:49:13

标签: ruby elasticsearch tire

我正在使用Tire / ElasticSearch创建按字母顺序浏览数据库中的所有标记。但是,轮胎搜索会返回我想要的标签以及与同一项目相关联的所有其他标签。因此,例如,如果我的信件是“A”并且项目的标签是'aardvark'和'biscuit',那么'aardvark'和'biscuit'都会显示为'A'查询的结果。我怎样才能构建这个以便我只得到'aardvark'?

 def explore
 #get alphabetical tire results with term and count only

    my_letter = "A"

    self.search_result = Tire.search index_name, 'tags' => 'count' do 
      query {string 'tags:' + my_letter + '*'}
        facet 'tags' do
          terms 'tags', :order => 'term'
      end

    end.results  
  end

映射:

{
    items: {
        item: {
            properties: {
                tags: {
                    type: "string",
                    index_name: "tag",
                    index: "not_analyzed",
                    omit_norms: true,
                    index_options: "docs"
                  },
              }
           }
       }
   }

1 个答案:

答案 0 :(得分:2)

遵循您需要更改的内容:

  1. <强>映射 您需要正确映射标记才能搜索它们。并且,作为您的标记,在项目文档中,您需要将标记的属性设置为嵌套,以便您也可以在构面中应用搜索查询。以下是您需要设置的映射:

    {
      item: {
        items: {
          properties: {
            tags: {
              properties: {
                 type: "nested",
                 properties: {
                    value: {
                    type: "string",
                    analyzer: 'not_analyzed'
                    }
                 }
              }
           }
         }
       }
      }
    }
    
  2. <强>查询 现在,您可以使用前缀查询来搜索以特定字母开头的标记并获取构面,这是完整的查询:

    query: {
      nested: {
        path: "tags",
        query: {
          prefix: {
            'tags.value' : 'A'
          }
        }
      }
    }
    facets: {
      words: {
        terms: {field: 'tags.value'},
        type: 'nested',
        facet_filter: {prefix: {
                                 'tags.value' : 'A'
                               }
                       }
      }
    }
    
  3. 在计算构面时应用构面滤镜,因此您只能获得符合条件的构面。我更喜欢常规exp的前缀查询。查询因性能问题。但我不太确定前缀查询是否适用于您的问题。让我知道它不起作用。