From 3e66767af3076621ec75428714a6c07a078afcef Mon Sep 17 00:00:00 2001 From: Viktor Lofgren Date: Sun, 5 Jan 2025 23:33:09 +0100 Subject: [PATCH] (search) Adjust query parsing to trim tokens in quoted search terms Quoted search queries that contained keywords with possessive 's endings were not returning any results, as the index does not retain that suffix, and the query parser was not stripping it away in this code path. This solves issue #143. --- .../functions/searchquery/QueryFactory.java | 11 +++++++++++ .../nu/marginalia/query/svc/QueryFactoryTest.java | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/code/functions/search-query/java/nu/marginalia/functions/searchquery/QueryFactory.java b/code/functions/search-query/java/nu/marginalia/functions/searchquery/QueryFactory.java index 12e98fba..b0b9a8e5 100644 --- a/code/functions/search-query/java/nu/marginalia/functions/searchquery/QueryFactory.java +++ b/code/functions/search-query/java/nu/marginalia/functions/searchquery/QueryFactory.java @@ -71,6 +71,17 @@ public class QueryFactory { String[] parts = StringUtils.split(str, '_'); + // Trim down tokens to match the behavior of the tokenizer used in indexing + for (int i = 0; i < parts.length; i++) { + String part = parts[i]; + + if (part.endsWith("'s") && part.length() > 2) { + part = part.substring(0, part.length()-2); + } + + parts[i] = part; + } + if (parts.length > 1) { // Require that the terms appear in sequence queryBuilder.phraseConstraint(SearchPhraseConstraint.mandatory(parts)); diff --git a/code/functions/search-query/test/nu/marginalia/query/svc/QueryFactoryTest.java b/code/functions/search-query/test/nu/marginalia/query/svc/QueryFactoryTest.java index b94bf77d..26a9928d 100644 --- a/code/functions/search-query/test/nu/marginalia/query/svc/QueryFactoryTest.java +++ b/code/functions/search-query/test/nu/marginalia/query/svc/QueryFactoryTest.java @@ -208,6 +208,17 @@ public class QueryFactoryTest { System.out.println(subquery); } + @Test + public void testQuotedApostrophe() { + var subquery = parseAndGetSpecs("\"bob's cars\""); + + System.out.println(subquery); + + Assertions.assertTrue(subquery.query.compiledQuery.contains(" bob ")); + Assertions.assertFalse(subquery.query.compiledQuery.contains(" bob's ")); + Assertions.assertEquals("\"bob's cars\"", subquery.humanQuery); + } + @Test public void testExpansion9() { var subquery = parseAndGetSpecs("pie recipe");