抱歉糟糕的标题,但让我解释一下我遇到的问题。我目前正在开发一个项目,其中一部分包括地址搜索引擎,我在elasticsearch中有。我想要做的是在我的搜索栏中输入一个新字符时使用fuzzy_like_this_field查询来生成自动完成结果并尝试“猜测”用户正在输入的(~1百万)个地址中的哪一个。
我的问题是我目前对查询有一个大小限制,因为返回所有结果既不必要又昂贵,时间紧迫。我的问题是,除非我从查询中返回1000或更多结果,否则我经常无法得到“正确”的结果。例如,如果我在尝试搜索“100 broadway”时输入“100 broad”并且我只返回200个结果(关于我可以做的最大值而不需要花费太长时间),100个百老汇无处可寻,即使所有返回的结果都具有比我想要的结果更高的levenshtein距离。如果我从查询中返回2000个结果,那么我将获得“100百老汇”作为第一个结果,但这需要太长时间。我甚至无法过滤返回的结果以将正确的结果带到顶部,因为它没有被返回。
不应该在查询中设置N的大小限制返回最佳N结果,而不是它们看似随机的子集?
如果措辞不当或太模糊,请抱歉。
答案 0 :(得分:0)
我想你可能会对fuzzy_like_this
query产生一些误解。
模糊化作为字符串提供的所有术语,然后选择最佳的n个区分术语...对于每个源术语,模糊变体保存在没有坐标因子的BooleanQuery中...
如果您只想基于Levenshtein距离进行模糊搜索,请使用fuzzy
query
答案 1 :(得分:0)
您可以使用edge ngram tokenizer编写自定义分析器,它可以帮助您实现所需的目标。在这里找到一个由elasticsearch演示的技术 https://www.elastic.co/guide/en/elasticsearch/guide/current/_index_time_search_as_you_type.html
然后进行简单的查询,例如
MML;SoldBagsReport;Merchant;APCS--T1;04/01/2016;
MML;SoldBagsReport;Client;MMSL--R10;04/12/2015;
会帮你做好这份工作。您也可以考虑使用不同的分析器进行搜索,这也在教程中显示(最后)。这将使您能够执行诸如对搜索查询进行标记并以与索引分析不同的方式对其进行预处理的操作。