从 2011 API 迁移后,CloudSearch 通配符查询不适用于 2013 API
CloudSearch wildcard query not working with 2013 API after migration from 2011 API
我最近将 CloudSearch 实例从 2011 升级到 2013 API。这两个实例都有一个名为 sid
的字段,它是一个包含双字母代码后跟一些数字的文本字段,例如LC12345。对于 2011 API,如果我 运行 像这样搜索:
q=12345*&return-fields=sid,name,desc
...我得到了 1 个结果,这很好。但是结果的 sid 是 LC12345
并且这就是它被索引的方式。数字 12345 不会 出现在任何生成的文档字段中的任何其他位置。我不明白为什么会这样。我只能假设这种类型的查询正在寻找甚至 包含 数字 12345 的任何字段中的任何术语。
我问的原因是因为当我使用 2013 API 查询时,此功能现在已损坏。我需要使用结构化查询解析器,但即使是使用简单解析器的类似通配符查询也无法正常工作,例如
q.parser=simple&q=12345*&return=sid,name,desc
...returns 什么都没有,虽然文档肯定在那里,即如果我查询 LC12345*
它会找到文档。
如果我能弄清楚如何让简单的查询像以前一样工作,那至少会让我开始了解如何使用结构化语法来做同样的事情。
为什么它不起作用
CloudSearch v1 (2011) 有一种不同的方式来标记混合字母 + 数字字符串。这是存档 docs(强调我的)中描述的逻辑。
If a string contains both alphabetic and numeric characters and is at
least three and no more than nine characters long, the alphabetic and
numeric portions of the string are treated as separate tokens. For
example, the string DOC298 is tokenized into two terms: doc 298
CloudSearch v2 (2013) text processing follows Unicode Text Segmentation,未指定该行为:
Do not break within sequences of digits, or digits adjacent to letters (“3a”, or “A3”).
解决方案
您应该能够搜索 *12345
以获取带有任何前缀的结果。可能会有一些边缘情况,比如取回您不想要的结果(前面有更多数字的东西,如 AB99912345);我对你的数据了解不多,无法判断这些是否是真正的问题。
另一种选择是将数字前缀与字母后缀分开编制索引,但这可能是不必要的额外工作。
我猜您使用的是英文 Cloudsearch,所以这可能不是您的具体问题,但也要注意搜索查询中的停用词:
在您的示例中,单词 "jo" 是丹麦语和其他语言的停用词,当然,支持的语言有一个停用词词典,其中包含非常常见的停用词。如果您没有在文本字段中指定语言,它将是英语。你可以在这里看到它们:https://docs.aws.amazon.com/cloudsearch/latest/developerguide/text-processing.html#text-processing-settings
我最近将 CloudSearch 实例从 2011 升级到 2013 API。这两个实例都有一个名为 sid
的字段,它是一个包含双字母代码后跟一些数字的文本字段,例如LC12345。对于 2011 API,如果我 运行 像这样搜索:
q=12345*&return-fields=sid,name,desc
...我得到了 1 个结果,这很好。但是结果的 sid 是 LC12345
并且这就是它被索引的方式。数字 12345 不会 出现在任何生成的文档字段中的任何其他位置。我不明白为什么会这样。我只能假设这种类型的查询正在寻找甚至 包含 数字 12345 的任何字段中的任何术语。
我问的原因是因为当我使用 2013 API 查询时,此功能现在已损坏。我需要使用结构化查询解析器,但即使是使用简单解析器的类似通配符查询也无法正常工作,例如
q.parser=simple&q=12345*&return=sid,name,desc
...returns 什么都没有,虽然文档肯定在那里,即如果我查询 LC12345*
它会找到文档。
如果我能弄清楚如何让简单的查询像以前一样工作,那至少会让我开始了解如何使用结构化语法来做同样的事情。
为什么它不起作用
CloudSearch v1 (2011) 有一种不同的方式来标记混合字母 + 数字字符串。这是存档 docs(强调我的)中描述的逻辑。
If a string contains both alphabetic and numeric characters and is at least three and no more than nine characters long, the alphabetic and numeric portions of the string are treated as separate tokens. For example, the string DOC298 is tokenized into two terms: doc 298
CloudSearch v2 (2013) text processing follows Unicode Text Segmentation,未指定该行为:
Do not break within sequences of digits, or digits adjacent to letters (“3a”, or “A3”).
解决方案
您应该能够搜索 *12345
以获取带有任何前缀的结果。可能会有一些边缘情况,比如取回您不想要的结果(前面有更多数字的东西,如 AB99912345);我对你的数据了解不多,无法判断这些是否是真正的问题。
另一种选择是将数字前缀与字母后缀分开编制索引,但这可能是不必要的额外工作。
我猜您使用的是英文 Cloudsearch,所以这可能不是您的具体问题,但也要注意搜索查询中的停用词:
在您的示例中,单词 "jo" 是丹麦语和其他语言的停用词,当然,支持的语言有一个停用词词典,其中包含非常常见的停用词。如果您没有在文本字段中指定语言,它将是英语。你可以在这里看到它们:https://docs.aws.amazon.com/cloudsearch/latest/developerguide/text-processing.html#text-processing-settings