diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2018-10-11 12:08:04 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@broadpark.no> | 2018-10-11 12:09:17 +0200 |
commit | b465c6e8aa3e5e0ac4fbdd9814b813e1c845457a (patch) | |
tree | 463f970cf9ab7a383a5fc5811733bd8fa8d7c8e4 /container-search | |
parent | 4ff6c2ae4efe291df5d420e75a4de7d61d961cc5 (diff) |
Handle lowercase for word items below a same element item.
Calculate proper name for lookup in index facts to check if lowercasing should be performed.
Diffstat (limited to 'container-search')
4 files changed, 56 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/AllLowercasingSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/AllLowercasingSearcher.java index 0d3eaff7fca..a1574368bc6 100644 --- a/container-search/src/main/java/com/yahoo/search/querytransform/AllLowercasingSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/querytransform/AllLowercasingSearcher.java @@ -27,4 +27,9 @@ public class AllLowercasingSearcher extends LowercasingSearcher { return true; } + @Override + public boolean shouldLowercase(String commonPath, WordItem word, IndexFacts.Session settings) { + return true; + } + } diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/LowercasingSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/LowercasingSearcher.java index 26c52a24e5c..343deef8a55 100644 --- a/container-search/src/main/java/com/yahoo/search/querytransform/LowercasingSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/querytransform/LowercasingSearcher.java @@ -54,6 +54,8 @@ public abstract class LowercasingSearcher extends Searcher { Item next = i.next(); if (next instanceof WordItem) { lowerCase((WordItem) next, indexFacts); + } else if (next instanceof SameElementItem) { + traverseSameElement((SameElementItem) next, indexFacts); } else if (next instanceof CompositeItem) { traverse((CompositeItem) next, indexFacts); } else if (next instanceof WeightedSetItem) { @@ -66,6 +68,15 @@ public abstract class LowercasingSearcher extends Searcher { } } + private void traverseSameElement(SameElementItem base, IndexFacts.Session indexFacts) { + for (Iterator<Item> i = base.getItemIterator(); i.hasNext();) { + Item next = i.next(); + if (next instanceof WordItem) { + lowerCase(base.getFieldName(), (WordItem) next, indexFacts); + } + } + } + private void lowerCase(WordItem word, IndexFacts.Session indexFacts) { if (shouldLowercase(word, indexFacts)) { word.setWord(toLowerCase(word.getWord())); @@ -73,6 +84,13 @@ public abstract class LowercasingSearcher extends Searcher { } } + private void lowerCase(String commonPath, WordItem word, IndexFacts.Session indexFacts) { + if (shouldLowercase(commonPath, word, indexFacts)) { + word.setWord(toLowerCase(word.getWord())); + word.setLowercased(true); + } + } + private static final class WeightedSetToken { final String token; final String originalToken; @@ -133,5 +151,6 @@ public abstract class LowercasingSearcher extends Searcher { * @return whether to convert the term to lower case */ public abstract boolean shouldLowercase(WordItem word, IndexFacts.Session indexFacts); + public abstract boolean shouldLowercase(String commonPath, WordItem word, IndexFacts.Session indexFacts); } diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/VespaLowercasingSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/VespaLowercasingSearcher.java index 74dcbb27817..1e8f436a05a 100644 --- a/container-search/src/main/java/com/yahoo/search/querytransform/VespaLowercasingSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/querytransform/VespaLowercasingSearcher.java @@ -35,4 +35,13 @@ public class VespaLowercasingSearcher extends LowercasingSearcher { return index.isLowercase() || index.isAttribute(); } + @Override + public boolean shouldLowercase(String commonPath, WordItem word, IndexFacts.Session indexFacts) { + if (word.isLowercased()) return false; + + StringBuilder sb = new StringBuilder(); + sb.append(commonPath).append(".").append(word.getIndexName()); + Index index = indexFacts.getIndex(sb.toString()); + return index.isLowercase() || index.isAttribute(); + } } diff --git a/container-search/src/test/java/com/yahoo/search/querytransform/LowercasingTestCase.java b/container-search/src/test/java/com/yahoo/search/querytransform/LowercasingTestCase.java index 7430b075140..4b2da823271 100644 --- a/container-search/src/test/java/com/yahoo/search/querytransform/LowercasingTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/querytransform/LowercasingTestCase.java @@ -7,6 +7,7 @@ import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; +import com.yahoo.prelude.query.SameElementItem; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -36,6 +37,7 @@ public class LowercasingTestCase { private static final String TEDDY = "teddy"; private static final String BAMSE = "bamse"; + private static final String SARR = "sarr"; IndexFacts settings; Execution execution; @@ -44,13 +46,19 @@ public class LowercasingTestCase { IndexFacts f = new IndexFacts(); Index bamse = new Index(BAMSE); Index teddy = new Index(TEDDY); + Index sarrBamse = new Index(SARR + "." + BAMSE); + Index sarrTeddy = new Index(SARR + "." + TEDDY); Index defaultIndex = new Index("default"); bamse.setLowercase(true); teddy.setLowercase(false); + sarrBamse.setLowercase(true); + sarrTeddy.setLowercase(true); defaultIndex.setLowercase(true); f.addIndex("nalle", bamse); f.addIndex("nalle", teddy); f.addIndex("nalle", defaultIndex); + f.addIndex("nalle", sarrBamse); + f.addIndex("nalle", sarrTeddy); f.freeze(); settings = f; execution = new Execution(new Chain<Searcher>( @@ -214,4 +222,19 @@ public class LowercasingTestCase { assertEquals("def", root.getAlternatives().get(2).word); assertEquals(1.0d, root.getAlternatives().get(2).exactness, 1e-15d); } + + @Test + public void testLowercaseingSameElement() { + Query q = new Query(); + SameElementItem root = new SameElementItem(SARR); + root.addItem(new WordItem("ABC", BAMSE, true)); + root.addItem(new WordItem("DEF", TEDDY, true)); + q.getModel().getQueryTree().setRoot(root); + Result r = execution.search(q); + root = (SameElementItem) r.getQuery().getModel().getQueryTree().getRoot(); + WordItem w0 = (WordItem) root.getItem(0); + WordItem w1 = (WordItem) root.getItem(1); + assertEquals("abc", w0.getWord()); + assertEquals("def", w1.getWord()); + } } |