我有两个表(项目和任务)都包含一个名称字段。我希望用户在输入新项目时能够同时搜索两个表。我想根据输入的所有条件对结果进行排名。用户应该能够按照他/她选择的任何顺序输入文本。例如,搜索:office bmt应产生以下结果:PR BMT Time - OfficeBMT Office - DevelopmentBMT Office - Development...以下搜索也应有效:BMT canter应包含此结果:Canterburry - BMT time所以部分匹配也需要工作。理想情况下,如果用户键入一个小错误,如:ofice bmt结果还是会出现的。我现在用这样的东西:where to_tsvector(projects.name || ' - ' || tasks.name) @@ to_tsquery('OFF:*&BMT:*')我在Ruby后端通过根据用户条目的空格分割来构建搜索字符串本身。这很好,但在某些情况下,它没有,我相信这是因为它解释它像英语,忽略了一些词,如,关闭,在,等等。。。例如,搜索:off bmt给出完全不包含Off的结果,因为Off被完全忽略。有没有办法避免这种情况,但仍然有良好的性能和模糊搜索?我不想把我的PG和ElasticSearch同步。我可以通过在WHERE子句中使用类似“%”的AND语句列表来完成此任务。。。%但这可能会损害性能,而且不支持fuzzysearch。 最佳答案 理想情况下,如果用户键入一个小错误,如:ofice bmt公司结果还是会出现的。在尽最大努力的基础上,这可能很难做到。如果有人进入“Canter”,系统如何知道他们是指缩短了Canterburry,还是“cancer”或“cantor”的拼写错误,或者他们真的是指一匹马的步态?也许您可以为您的特定字段创建一个常见拼写错误字典?而且,如果不知道时区是可以预期的,而且是常见的,那么“bmt”似乎是某种东西的拼写错误。这很好,但在某些情况下,它没有,我相信这是因为它解释它像英语,忽略了一些词,如,关闭,在,等等。。。别只相信,看看!select to_tsquery('english','OFF:*&BMT:*'); to_tsquery------------ 'bmt':*是的,to tsquery确实省略了停止字,即使使用了:*thingy。一种选择是使用“simple”而不是“english”作为配置:select to_tsquery('simple','OFF:*&BMT:*'); to_tsquery------------------- 'off':* & 'bmt':*另一种选择是直接编写tsquery,而不是直接处理到tsquery。注意,在这种情况下,您必须自己降低大小写:select 'off:*&bmt:*'::tsquery; tsquery------------------- 'off':* & 'bmt':*还要注意,如果使用“office:*”执行此操作,则在“english”配置中永远不会得到匹配,因为文档中的“office”被词干化为“office”,而在编写“office:*”::tsquery时不会发生词干化。所以你可以用“简单”而不是“英语”来避免词干和停止词。或者,您可以单独测试查询中的每个单词,看它是否在决定向其添加:*之前得到词干。有没有办法避免这种情况,但仍然有良好的性能和模糊搜索?我不想把我的PG和ElasticSearch同步。你说的模糊搜索是什么意思?你现在好像不用了。您只是在使用前缀匹配,意外地使用词干和停止字。要搜索的表有多大,可以接受哪种性能?如果你使用了ElasticSearch,那么你将如何表达你的搜索?如果你解释了在ES中搜索的词组,也许有人可以帮你在PostgreSQL中做同样的事情。我不认为我们可以认为切换到ES会神奇地做正确的事情。我可以在WHERE子句中建立一个和语句的列表与“%”。。。%“但那可能会影响表演不支持fuzzysearch。你查过吗?它可以使这些类型的查询相当快。而且,“…%”比您当前所做的要模糊得多,所以我不明白您将如何失去它。pg_trgm还提供了更模糊的“”运算符,这可能是您的最佳选择。当嵌入到长字符串中时,它可以很好地处理输入错误,但在短字符串中,它们确实是一个问题。关于postgresql - 使用Postgresql全文搜索模糊匹配所有搜索词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58651852/
10-15 18:46