多字段与字段数据进行查询和排序

时间:2020-07-22 09:09:45

标签: elasticsearch lucene

我有一个使用Elasticsearch 6的简单“人”数据库​​,基本上看起来像这样:

---------------------
...
       Project
           src
               MyApp
                   __init__.py
                   __main__.py
               FrameworkPackage1
                   __init__.py
                   sourcefile1.py
               FrameworkPackage2
                   __init__.py
                   sourcefile2.py
           setup.py
           README.md
---------------------

我想按Y = zeros(5000,10); for i = 1:5000 Y(i,y(i))=1; end (和/或id | firstName | lastName ------------------------- 1 | Tim | Berners-Lee 2 | Linus | Torvalds 3 | Noam | Chomsky 进行查询和排序-取决于用户输入)。

现在,我找到了2种似乎可行的解决方案,但是我不确定哪一种是“正确的”(或“更好的”)以及原因:

  1. 多字段:lastName:我可以使用firstName进行查询并使用"type": "text", "fields": { "raw": { "type": "keyword" } }进行排序。

  2. fielddata:lastName:在这里,我可以使用lastName.raw进行查询和排序。

但是我完全不确定为什么我应该选择一个,以及这种选择有什么含义。

1 个答案:

答案 0 :(得分:1)

希望以下几点将帮助您根据实际用例做出决定。

  1. 多个字段

    用途-使用不同的分析器存储单个字段。如您所使用的textkeyword

    它没有任何特殊的缓存。

  2. 字段数据

    用途-在聚合/排序过程中提供更快的访问权限。它将所有数据加载到字段缓存。 尽管您可以使用它满足您的需求,但这很昂贵。

    1. 加载字段数据非常昂贵
    2. 一旦加载,它将在Lucene段的整个生命周期内保持不变
    3. 由于您的字段是文本,因此它将占用大量的堆空间。

但是您可以使用fielddata_frequency_filter

控制加载到内存中的字词数量

您确实在text字段上进行了排序。文件中的建议是

相反,您应该有一个用于全文搜索的文本字段,以及一个已启用doc_values进行汇总的未分析的关键字字段

因此,如果您有更多数据并计划使用field data

,则需要根据数据大小,数据访问模式,服务器成本进行选择。