如何在Elasticsearch中对分析/标记化字段进行排序?

时间:2014-04-24 15:29:55

标签: sorting elasticsearch elastica

我们在索引中存储title字段,并希望将该字段用于两个目的:

  1. 我们正在使用ngram过滤器进行分析,以便我们提供自动完成和即时结果
  2. 我们希望能够在title字段上使用ASC排序列出结果,而不是得分。
  3. 索引/过滤器/分析器的定义如下:

    array(
        'number_of_shards' => $this->shards,
        'number_of_replicas' => $this->replicas,
        'analysis' => array(
            'filter' => array(
                'nGram_filter' => array(
                    'type' => 'nGram',
                    'min_gram' => 2,
                    'max_gram' => 20,
                    'token_chars' => array('letter','digit','punctuation','symbol')
                )
            ),
    
            'analyzer' => array(
                'index_analyzer' => array(
                    'type' => 'custom',
                    'tokenizer' =>'whitespace',
                    'char_filter' => 'html_strip',
                    'filter' => array('lowercase','asciifolding','nGram_filter')
                ),
                'search_analyzer' => array(
                    'type' => 'custom',
                    'tokenizer' =>'whitespace',
                    'char_filter' => 'html_strip',
                    'filter' => array('lowercase','asciifolding')
                )
            )
        )
    ),
    

    当我们对title字段进行排序时,我们遇到的问题是无法预测的结果。在做了一点搜索之后,我们在ElasticSearch的{​​{1}}手册页末尾找到了这个...(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#_memory_considerations

      

    对于基于字符串的类型,不应对分类的字段进行分析/标记化。

    我们如何分析该字段并在以后对其进行排序?我们是否需要使用sort将字段存储两次以进行排序?由于字段not_analyzed也将_source值存储在其原始状态中,是否可以将其用于排序?

1 个答案:

答案 0 :(得分:7)

您可以在Elasticsearch中使用Multi Field Type的内置概念。

  

multi_field类型允许映射具有相同值的几个core_types。这可以非常方便,例如,当想要映射字符串类型时,一旦它被分析,一次它没有被分析。

在Elasticsearch参考资料中,请查看有关如何设置所需内容的String Sorting and Multi Fields指南。

请注意,Elasticsearch 0.90.X和1.X之间的多字段映射配置已更改。根据您的版本使用适当的以下指南: