elasticsearch,Lucene,elasticsearch" /> elasticsearch,Lucene,elasticsearch" />

Lucene 弹性搜索文档排序、索引问题

Lucene 弹性搜索文档排序、索引问题,lucene,elasticsearch,Lucene,elasticsearch,我的ElasticSearch索引中有9000个文档 我想按分析过的字符串字段排序,因此,为了做到这一点,我知道(通过谷歌)我必须更新映射以使字段不被分析,这样我就可以按此字段排序,并且我必须重新索引数据以反映映射中的变化 重新编制索引的过程在我的机器上花费了大约20分钟 奇怪的是,在一台功能强大的生产服务器上,重新编制索引的过程耗时约2小时 我检查了服务器上的内存状态和处理器使用情况,一切正常 我想知道的是: 是否有一种方法可以按已分析的标记化字段对文档进行排序,而无需对整个文档重新编制索引

我的ElasticSearch索引中有9000个文档

我想按分析过的字符串字段排序,因此,为了做到这一点,我知道(通过谷歌)我必须更新映射以使字段不被分析,这样我就可以按此字段排序,并且我必须重新索引数据以反映映射中的变化

重新编制索引的过程在我的机器上花费了大约20分钟

奇怪的是,在一台功能强大的生产服务器上,重新编制索引的过程耗时约2小时

我检查了服务器上的内存状态和处理器使用情况,一切正常

我想知道的是:

  • 是否有一种方法可以按已分析的标记化字段对文档进行排序,而无需对整个文档重新编制索引

  • 如果我必须重新索引整个文档,那么为什么在服务器上重新索引文档要花费这么长的时间??或者如何在该服务器上跟踪慢度原因


  • 只要字段存储在_source中,我很确定每次搜索时都可以使用脚本创建自定义字段

    {
      "query" : { "query_string" : {"query" : "*:*"} },
      "sort" : {
        "_script" : { 
            "script" : "<some sorting field>",
            "type" : "number",
            "params" : {},
            "order" : "asc"
        }
      }
    }
    
    {
    “查询”:{“查询字符串”:{“查询”:“*:*”},
    “排序”:{
    “_脚本”:{
    “脚本”:“,
    “类型”:“编号”,
    “参数”:{},
    “订单”:“asc”
    }
    }
    }
    

    这样做的缺点是每次搜索时都要在服务器端重新评估排序脚本,但我认为它可以解决(1)。

    至于1。对映射的任何更改都需要重新索引。然而,有一个经过分析的字段(用于显示/搜索或其他目的)和一个未经分析的字段(包含相同的数据)并排排序是完全有效的(而且做了很多很多次)。也许这回答了我似乎从你的问题中推断出的你的隐含用例。使用相同的数据映射到多个字段(如我上面所建议的)可以很容易地完成,而不需要更改你的客户端代码