分析字段与doc_values:true字段

时间:2017-09-05 14:28:53

标签: elasticsearch

我们有一个包含超过5亿个文档的弹性搜索,每个文档都有一个存储URL的网址字段。

网址字段映射目前具有以下设置:

get-vw

我们希望用户能够搜索网址或部分网址,而无需使用通配符。 例如,使用路径:{ index: not_analyzed doc_values: true ... }

获取网址

他们应该能够通过搜索来恢复匹配的文档:

  • /part1/user@site/part2/part3.ext
  • part3.ext
  • user@site
  • part1

我看到它的方式,我们有两个选择:

  1. 实现此字段的分析版本(不再具有part2/part3.ext)并匹配查询而不是通配符。这还需要使用自定义分析器来利用模式分词器来使提取的术语正确(标准分词器会将doc_values: true分成user@siteuser)。
  2. 浏览我们的数据库,为每个文档创建一个新的字段,该字段是URL部分的列表。这个字段可以site仍然存储在堆外,我们可以对确切的字段值而不是通配符进行术语查询。
  3. 我的问题是:

    哪个更适合性能:拥有一个doc_values: true开启的变量长度列表,或者有一个分析字段? (即:选项1或选项2)或者是否有更好的选项3?!

    感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您的问题是关于需要doc_values但无法使用keyword-analyzer编制索引的字段。

您没有提到为什么需要doc_values。但你确实提到你目前没有在这个领域搜索。 所以我猜搜索字段的名称不必相同:你可以copy在另一个仅用于搜索的字段中的字段值(" store":false) 。对于这个新字段,您可以使用pattern-analyzerpattern-tokenizer作为用例。

答案 1 :(得分:1)

似乎没有人实际上对这两个选项进行了性能测试,所以我做了。

我拿了1000万份文件的样本并创建了两个新的索引:

  1. 具有已分析字段的索引,已根据其他答案中的建议进行设置。
  2. 包含string字段的索引,用于存储网址分段的所有排列。
  3. 我在第二个索引上运行了一个浓缩过程来填充字段。当我从主索引重新索引样本数据时,创建了第一个索引上的字段值。

    然后我创建了一组针对指数运行的加特林测试,并比较了各自的加特林结果和netdata(https://github.com/firehol/netdata)格局。

    结果如下:

    Quantile Comparisons of analysed vs not analysed list

    关于网络数据格局:分析的字段显示所有弹性节点上的峰值 - 尽管只是一个小峰值。 not_analysed列表字段测试甚至没有注册。

    值得一提的是,在我们的案例中,使用URL分段排列丰富列表字段会使索引膨胀大约80%。所以需要权衡 - 您永远不需要对URL进行精确的子段匹配进行通配符搜索,但是您需要更多的磁盘来执行此操作。

    更新

    不要这样做。去找doc_values。对具有大量可能术语的已分析字符串执行任何操作将意味着大量字段数据最终将永远不会适合您可以分配它的内存量。