我正在寻找能够使用模糊逻辑算法查找超过一百万条酒店名称记录的匹配的搜索引擎。我的想法是,如果输入拼写错误或与预期的顺序不同,就能找到/建议酒店名称。
我尝试使用clj-fuzzy库在ArangoDB上构建FOXX应用程序。 freetext集合在每个条目上应用一种算法(Metaphone,Double Metaphone,Soundex,NYSIIS,Caverphone,Cologne Phonetic或MRA codex)并存储在代码属性中。在该字段上创建FULLTEXT索引,并使用此AQL查询:
/*
Example using doubleMetaphone
-----------------------------
Hotel: Four (FR) Points (PNTS) By (P) Sheraton (XRTN) Daning (TNNK)
Input: Sheraton (XRTN) Points (PNTS)
*/
for h in FLATTEN(UNION(
(return FULLTEXT(fte_hotels, "fullcode", "XRTN")),
(return FULLTEXT(fte_hotels, "fullcode", "PNTS"))
))
let score = (CONTAINS(h.fullcode, "XRTN") && CONTAINS(h.fullcode, "PNTS") ? 10:0) +
(CONTAINS(h.fullcode, "XRTN") ? 1:0) +
(CONTAINS(h.fullcode, "PNTS") ? 1:0)
sort score desc
limit 10
return { hotel: h, score: score }
编辑: 关于如何使用Sql Server实现相同的任何其他建议?
由于
答案 0 :(得分:3)
到目前为止你做的很好看。如果你想对单词进行模糊搜索,那么你必须使用专门的算法对单词进行一些预处理。
略微优化查询:如果您愿意,还可以在FULLTEXT
的一次调用中查找这两个搜索项。
以下栏目
for h in FLATTEN(UNION(
(return FULLTEXT(fte_hotels, "fullcode", "XRTN")),
(return FULLTEXT(fte_hotels, "fullcode", "PNTS"))
))
...
应该可以转换为以下稍微简单的表达式:
for h in FULLTEXT(fte_hotels, "fullcode", "XRTN,|PNTS")
...