1

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

 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"
                  },
              }
           }
       }
   }
4

1 回答 1

2

以下是您需要更改的内容:

  1. 映射 您需要正确映射标签才能搜索它们。由于您的标签在您的项目文档中,您需要将标签的属性设置为嵌套,以便您也可以在构面中应用搜索查询。这是您需要设置的映射:

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

    询问: {
      嵌套:{
        路径:“标签”,
        询问: {
          字首: {
            'tags.value':'A'
          }
        }
      }
    }
    方面:{
      字: {
        条款:{字段:'tags.value'},
        类型:'嵌套',
        facet_filter:{前缀:{
                                 'tags.value':'A'
                               }
                       }
      }
    }
    

在计算构面时应用构面过滤器,因此您只会获得符合您的条件的构面。我更喜欢前缀查询而不是常规 exp。由于性能问题而查询。但我不太确定前缀查询是否适用于您的问题。让我知道它不起作用。

于 2013-11-06T06:17:10.860 回答