public NodeQuery build(QueryNode queryNode) throws QueryNodeException { FuzzyQueryNode fuzzyNode = (FuzzyQueryNode) queryNode; String text = fuzzyNode.getTextAsString(); int numEdits = FuzzyQuery.floatToEdits(fuzzyNode.getSimilarity(), text.codePointCount(0, text.length())); NodeFuzzyQuery fuzzyQuery = new NodeFuzzyQuery(new Term(fuzzyNode.getFieldAsString(), fuzzyNode.getTextAsString()), numEdits, fuzzyNode.getPrefixLength()); // assign the datatype. We must always have a datatype assigned. fuzzyQuery.setDatatype((String) queryNode.getTag(DatatypeQueryNode.DATATYPE_TAGID)); // if it is tagged as a span query if (fuzzyNode.getTag(QueryTypeProcessor.QUERYTYPE_TAG) == QueryTypeProcessor.SPAN_QUERYTYPE) { return new MultiTermSpanQuery<>(fuzzyQuery); } else { return fuzzyQuery; } }
@Test public void testFuzzyQuery() throws Exception { ConciseKeywordQueryParser parser = new ConciseKeywordQueryParser(); parser.setAttribute("aaa"); // must have a prefix length of 4 NodeFuzzyQuery q = new NodeFuzzyQuery(new Term(SirenTestCase.DEFAULT_TEST_FIELD, "aaa:michel"), NodeFuzzyQuery.defaultMaxEdits, 4); q.setDatatype("http://www.w3.org/2001/XMLSchema#string"); assertEquals(q, parser.parse("michel~", SirenTestCase.DEFAULT_TEST_FIELD)); // with no attribute defined parser = new ConciseKeywordQueryParser(); q = new NodeFuzzyQuery(new Term(SirenTestCase.DEFAULT_TEST_FIELD, "michel")); q.setDatatype("http://www.w3.org/2001/XMLSchema#string"); assertEquals(q, parser.parse("michel~", SirenTestCase.DEFAULT_TEST_FIELD)); }
@Test public void testFuzzyQuery2() throws Exception { final NodeFuzzyQuery q1 = new NodeFuzzyQuery(new Term(SirenTestCase.DEFAULT_TEST_FIELD, "michel")); q1.setDatatype("http://www.w3.org/2001/XMLSchema#string"); this._assertSirenQuery(new LuceneProxyNodeQuery(q1), "michel~"); final TwigQuery q2 = new TwigQuery(1); q2.addChild(q1, NodeBooleanClause.Occur.MUST); this._assertSirenQuery(new LuceneProxyNodeQuery(q2), "* : michel~"); final int numEdits = FuzzyQuery.floatToEdits(0.8f, "michel".codePointCount(0, "michel".length())); final NodeFuzzyQuery q3 = new NodeFuzzyQuery(new Term(SirenTestCase.DEFAULT_TEST_FIELD, "michel"), numEdits); q3.setDatatype("http://www.w3.org/2001/XMLSchema#string"); this._assertSirenQuery(new LuceneProxyNodeQuery(q3), "michel~0.8"); // first tilde is escaped, not the second one final NodeFuzzyQuery q4 = new NodeFuzzyQuery(new Term(SirenTestCase.DEFAULT_TEST_FIELD, "http://sw.deri.org/~aida")); q4.setDatatype("http://www.w3.org/2001/XMLSchema#string"); this._assertSirenQuery(new LuceneProxyNodeQuery(q4), "'http://sw.deri.org/~aida'~"); }
@Test public void testFuzzyQueries() throws Exception { BooleanSpanQuery bsq = new BooleanSpanQuery(0, false); bsq.add(tsq("aaa").getQuery(), NodeBooleanClause.Occur.MUST); NodeFuzzyQuery fuzzy = new NodeFuzzyQuery(new Term(SirenTestCase.DEFAULT_TEST_FIELD, "bbb")); fuzzy.setDatatype("http://www.w3.org/2001/XMLSchema#string"); bsq.add(new MultiTermSpanQuery<>(fuzzy), NodeBooleanClause.Occur.MUST); this._assertSirenQuery(new LuceneProxyNodeQuery(bsq), "(aaa AND bbb~)~0"); }