Javascript AWS CloudSearch查询,近似于Algolia';s标准;简单的;搜索规则

Javascript AWS CloudSearch查询,近似于Algolia';s标准;简单的;搜索规则,javascript,algolia,amazon-cloudsearch,Javascript,Algolia,Amazon Cloudsearch,我正在从Algolia迁移到AWS CloudSearch(我正在搜索~150K条记录,而Algolia对于个人项目来说太贵了),我发现自己在基本查询的结果中缺少了Algolia的一般智慧和直觉,w/o必须对用户输入的搜索字符串应用任何复杂的解析和查询语法转换 我确信其中很多都是专有的,部分是algolia的“秘密酱汁”,但有没有任何预构建的解决方案,用于解析/格式化原始用户输入的搜索字符串,并将其转换为CloudSearch的结构化语法,该语法大致近似于您从algolia的“基本”搜索相同字符

我正在从Algolia迁移到AWS CloudSearch(我正在搜索~150K条记录,而Algolia对于个人项目来说太贵了),我发现自己在基本查询的结果中缺少了Algolia的一般智慧和直觉,w/o必须对用户输入的搜索字符串应用任何复杂的解析和查询语法转换

我确信其中很多都是专有的,部分是algolia的“秘密酱汁”,但有没有任何预构建的解决方案,用于解析/格式化原始用户输入的搜索字符串,并将其转换为CloudSearch的结构化语法,该语法大致近似于您从algolia的“基本”搜索相同字符串中获得的相同类型的结果?(假设搜索应用于文档中的所有文本字段)

例如,开箱即用,algolia将给出部分/前缀匹配的结果(例如,对于“appl”,您将得到“apple”的结果),以及多词短语、错误拼写的单词、未完成的短语等的不精确/粗略结果。虽然我能够用CloudSearch的结构化语法重新实现其中的一些结果,结果不一致,只是不完全一致。下面是我为此开始的一些逻辑示例:

function formatSearchTerm(term: string, distance = 25) {
  let formatted = escapeSearchTerm(term.trim());
  let words = formatted.split(/\s+/);
  let lastWord = words[words.length - 1];

  if (quotedRegex.test(term)) {
    return `(phrase '${stripQuotes(formatted)}')`;
  }

  if (!singleWordRegex.test(term)) {
    return `(or (near distance=${distance} '${formatted}') (prefix '${lastWord}'))`;
  }

  return `(or (prefix '${formatted}') '${formatted}')`;
}