当前位置: 首页 > 知识库问答 >
问题:

spring jdbc准备的语句存在布尔全文搜索格式问题

滕翔飞
2023-03-14

我有一个使用布尔全文搜索的sql查询:

SELECT
    *,
    MATCH (job_title) AGAINST ('"product manager"' in boolean mode) AS title_relevance_exact,
    MATCH (job_description) AGAINST ('"product manager"' in boolean mode) AS description_relevance_exact,
    MATCH (job_title) AGAINST ('product manager' in boolean mode) AS title_relevance_part,
    MATCH (job_description) AGAINST ('product manager' in boolean mode) AS description_relevance_part
FROM
    jobs
WHERE
    MATCH(job_title, job_description) AGAINST ('product manager') AND
    date_posted >= now() - INTERVAL 30 DAY
ORDER BY
    job_title LIKE 'product manager' DESC,
    title_relevance_exact DESC,
    description_relevance_exact DESC,
    title_relevance_part DESC,
    description_relevance_part DESC
LIMIT 300;

即,“产品经理”中的引号和语音标记对查询很重要。

当我以spring jdbc预备语句的形式运行这个查询时,我必须做一些工作来正确格式化字符串,因为如果我有< code > '?',jdbc不会将它识别为参数:

String queryPrepared =
                "SELECT\n" +
                "   *,\n" +
                "   MATCH (job_title) AGAINST (? in boolean mode) AS title_relevance_exact,\n" +
                "   MATCH (job_description) AGAINST (? in boolean mode) AS description_relevance_exact,\n" +
                "   MATCH (job_title) AGAINST (? in boolean mode) AS title_relevance_part,\n" +
                "   MATCH (job_description) AGAINST (? in boolean mode) AS description_relevance_part\n" +
                "FROM\n" +
                "   jobs\n" +
                "WHERE\n" +
                "   MATCH(job_title, job_description) AGAINST (?) AND\n" +
                "   date_posted >= now() - INTERVAL 30 DAY\n" +
                "ORDER BY\n" +
                "   job_title LIKE ? DESC,\n" +
                "   title_relevance_exact DESC,\n" +
                "   description_relevance_exact DESC,\n" +
                "   title_relevance_part DESC,\n" +
                "   description_relevance_part DESC\n" +
                "LIMIT 500;";
        String param1 = String.format("'\"%1$s\"'", searchValue);
        String param2 = String.format("'%1$s'", searchValue);

        List<Map<String, Object>> resultPrepared = jdbcTemplate.queryForList(queryPrepared,
                new Object[] {param1, param1, param2, param2, param2, param2});

但是查询没有生成正确的结果,结果的顺序也不符合预期。我只能假设这是由于prepared语句参数中的格式设置造成的。但我看不到添加参数后的查询是什么样子,我如何调试它?

共有1个答案

管景天
2023-03-14

您需要从值中删除单引号。SQL中的单引号在查询字符串中分隔字符串文字。设置参数值时,只需设置不带单引号的字符串值。

因此,如果要将文本“产品管理器”替换为参数,则在查询中使用 (因此,不带单引号),并设置值“product manager”(同样,不带单引号),作为 Java 字符串文本,该值是“\”product manager\”。

在作为参数传递的值中使用单引号相当于使用SQL字符串文字""产品经理"""

 类似资料:
  • 我目前正在为一个网站创建一个非常简单的搜索特性,在该特性中,用户可以使用许多不同的条件(从一个到多个,不同的数量)在数据库中搜索事件,我正在使用准备好的语句,特别是bind_param()遇到一个问题。 以下是相关的PHP代码: 我收到的错误状态

  • 问题内容: 我的目的是在表中找到与存储在String中的集合匹配的所有项目: 这似乎并不完美,它总是向我发出以下警告: 如果我有一个参数,这将是显而易见的: 但是由于我不得不处理这个问题,这对我来说有点复杂。 问题答案: Prepared语句没有参数,因为您在准备列表之前已将列表插入到该语句中。 至此,您创建的SQL语句为: 由于该语句没有参数,因此失败。而不是将项目插值到语句(容易注入)中,而是

  • 本文向大家介绍solr 布尔搜索,包括了solr 布尔搜索的使用技巧和注意事项,需要的朋友参考一下 示例 +firstname:john +surname:doe 匹配名字为john且姓氏为doe的文档。+前缀表示搜索词必须出现(AND)。 +firstname:john -surname:doe 匹配名字为john而名字不是doe的文档。-前缀表示不得出现搜索词(否)。 +firstname:j

  • 我似乎不知道为什么我的代码会以我看到的方式运行。我错过了什么? 我希望看到偶数或奇数取决于用户输入的数字?

  • 我正在使用我生成的一个准备好的语句,但在Java抛出的语句上出现了语法错误。然而,当我将PS的toString复制并粘贴到数据库的phpmyadmin中时,它的执行完美无缺。有什么想法会出错吗,我很难理解? 编辑:更改为PS.ExecuteUpdate(查询);还是不起作用。

  • 我一直在读一些较新的JDBC连接池(如Tomcat)不支持客户端语句池。我已经读到,这是因为大多数JDBC驱动程序都维护自己的语句缓存。然而,我不认为PostgreSQL会发生这种情况。 我说的对吗?如果是这样,我应该使用一个连接池来缓存准备好的语句,以获得最佳的批插入性能吗? 谢谢