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");