【问题标题】:How to sort on analyzed/tokenized field in Elasticsearch?如何对 Elasticsearch 中的已分析/标记化字段进行排序?
【发布时间】:2014-04-24 15:29:55
【问题描述】:

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

  1. 我们正在使用 ngram 过滤器进行分析,以便提供自动完成和即时结果
  2. 我们希望能够在 title 字段上使用 ASC 排序而不是分数来列出结果。

索引/过滤器/分析器的定义如下:

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 的 sort 手册页的末尾找到了这个... (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#_memory_considerations)

对于基于字符串的类型,排序依据的字段不应被分析/标记化。

我们怎样才能既分析该字段,又对其进行排序呢?我们是否需要使用not_analyzed 将字段存储两次以进行排序?由于字段_source 也将title 值存储为原始状态,因此不能用于排序吗?

【问题讨论】:

    标签: sorting elasticsearch elastica


    【解决方案1】:

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

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

    在 Elasticsearch 参考中,请查看 String Sorting and Multi Fields 指南,了解如何设置您需要的内容。

    请注意,多字段映射配置在 Elasticsearch 0.90.X 和 1.X 之间发生了变化。根据您的版本使用适当的以下指南:

    【讨论】:

    • 正是我想要的,谢谢!我特别喜欢与您链接的页面相关的页面上关于The naive approach to indexing the same string in two ways would be to include two separate fields in the document 的部分;)
    • 如果你存储了title的slug,可能这是一个“not_analyzed”字段,所以你可以按slug排序。
    • 你知道问题第二部分的答案吗:“既然字段 _source 也存储了原始状态的标题值,那不能用来排序吗?”我很好奇为什么在这种情况下不可能按源值排序?
    • 来自 Elasticsearch 文档,“_source 字段包含在索引时传递的原始 JSON 文档正文。_source 字段本身没有被索引(因此不可搜索),但它是这样存储的它可以在执行 fetch 请求时返回,例如 get 或 search。”排序字段需要可搜索才能正确排序。因此,这会将您排除在使用 _source 字段之外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多