当前位置: 首页 > 面试题库 >

如何在Elasticsearch中的分析/标记化字段上排序?

冯宏放
2023-03-14
问题内容

我们正在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字段上排序时,我们遇到的问题是不可预测的结果。经过一番搜索后,我们sort在ElasticSearch手册页的末尾找到了这个…(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-
request-sort.html#
_memory_considerations

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

我们如何才能分析该字段并在以后对其进行排序?
我们是否需要使用一次存储两次来存储字段not_analyzed以进行排序?由于该字段_sourcetitle以其原始状态存储值,因此不能将其用于排序吗?


问题答案:

您可以在Elasticsearch中使用多字段类型的内置概念。

multi_field类型允许映射相同值的多个core_type。例如,当要映射一个字符串类型时,一次分析时一次,而not_analyzed一次,这可能非常方便。

在《
Elasticsearch参考》中,请查看有关如何设置所需内容的《字符串排序和多字段》指南。

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

  • 0.90多字段类型
  • 1.X多字段类型


 类似资料:
  • 问题内容: 我正在建立搜索,但需要使用不同的分析器分析1个字段。我的问题是,对于一个字段,我需要在其上安装一个分析器以进行词干分析(雪球),然后还需要一个分析器将完整的单词保留为一个标记(关键字)。我可以通过以下索引设置来使其工作: 在标题字段中搜索单个单词时出现问题。如果其中装有“帽子里的猫”,它将存储为“帽子里的猫”,但是如果我搜索猫,我什么也得不到。 这是否有可能实现?还是我需要有2个单独的

  • 问题内容: 有没有办法让ElasticSearch在分析的字段上识别完全匹配?理想情况下,我想小写,标记化,词干化,甚至对我的文档进行语音化,然后让查询提取“精确”匹配项。 我的意思是,如果我索引“汉堡包”和“汉堡包”,它们将被分析为[“汉堡包”,“小圆面包”]和[“汉堡包”]。如果我搜索“汉堡”,它将仅返回“汉堡”文档,因为这是“完全匹配”。 我尝试使用关键字标记器,但不会阻止各个标记。我是否需

  • 问题内容: 如何在结果中返回特定字段的标记 例如,一个GET请求 退货 我想在结果中包含“ _source.message”字段的标记 问题答案: 使用以下script_fields脚本还有另一种方法: 重要的是要注意,尽管此脚本返回已被索引的实际术语,但它也会缓存所有字段值,并且在大索引上会占用大量内存。因此,在较大的索引上,使用以下MVEL脚本从存储的字段或源中检索字段值并快速重新解析它们可能

  • 我有一个法语单词索引。我想在索引属性上应用一个分析器。假设我有一个标题属性,我想将其视为“法国属性”。我试过这个(在基巴纳): 但它导致: 我不明白为什么我会有这个错误。如果我显示映射(

  • 我试图用_analyze API获得关键字标记的多字同义词。API对单字同义词返回预期结果,但对多字同义词不返回预期结果。以下是我的设置和分析链: 为什么analyze API不返回具有同义词类型的“foo bar”和“fooo bar”标记?

  • 本文向大家介绍如何在MySQL中按分组字段排序?,包括了如何在MySQL中按分组字段排序?的使用技巧和注意事项,需要的朋友参考一下 要对分组字段进行ORDER BY,请将ORDER BY CASE与一起使用。CASE评估不同的条件,而ORDER BY则按升序或降序对值进行排序。MySQL用于查找匹配项。 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记