为什么CloudSearch不会在文件名文本字段中找到子字符串匹配?

时间:2017-12-08 17:36:44

标签: amazon-web-services amazon-cloudsearch

我有一个带有filename文本字段的CloudSearch域。我的问题是文本查询不会匹配(某些)文档与我认为(逻辑上)应该的文件名。如果我有这些文件名的文件:

  1. '汽车'
  2. 'Cars Movie.jpg'
  3. 'cars.pdf'
  4. '汽车#.JPG'
  5. 我执行'汽车'的简单文本查询,我找回文件#1,#2和#4但不是#3 。如果我搜索'cars *'(或使用前缀进行结构化查询),我可以匹配#3。这对我来说没有意义,特别是#4匹配,但#3没有。

1 个答案:

答案 0 :(得分:2)

TL; DR 这是因为标记化算法处理句点的方式。

执行文本搜索时,您将对已处理的数据执行搜索,而不是对文字字段执行搜索。 (也许这应该是显而易见的,但我之前并没有考虑过它。)

documentation概述了文本的处理方式:

  

在索引编制期间,Amazon CloudSearch会根据为该字段配置的分析方案处理文本和文本数组字段,以确定要添加到索引的条件。在应用分析选项之前,文本将被标记化并标准化。

最终导致此行为的进程部分是标记化:

  

在标记化期间,使用Unicode文本分割算法中定义的分词规则,将字段中的文本流拆分为可检测边界上的单独标记。

     

根据单词划分规则,由空格分隔的字符串(如空格和制表符)将被视为单独的标记。在许多情况下,标点符号被删除并被视为空格。例如,字符串按连字符( - )和at符号(@)分割。 但是,空格后面没有的句点被视为令牌的一部分

我看到问题中描述的匹配的原因是因为文件扩展名包含在它们之前的任何内容中作为单个标记。如果我们回顾一下这个例子,并根据这些规则建立一个索引,那么为什么搜索'cars'会返回文档#1,#2和#4而不是#3。

#    Text                Index

1    'cars'              ['cars']
2    'Cars Movie.jpg'    ['cars', 'movie.jpg']
3    'cars.pdf'.         ['cars.pdf']
4    'cars#.jpg'         ['cars', '.jpg']

可能的解决方案

设置自定义分析方案似乎可以解决这个问题,但那里没有任何选项(停用词,词干,同义词)可以帮助您克服标记化问题。我认为,获得所需行为的唯一可能解决方案是在上载之前对文件名进行标记(使用自定义算法),然后将标记存储在文本数组字段中。虽然设计支持多种语言的自定义标记化算法是一个很大的问题。