mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-14 17:58:59 +00:00
Query parser fix ups and removal of deprecated lucene APIs from the query parser: ALFCOM-2288, ALFCOM-2289, ALFCOM-2290, MOB-587, MOB-631
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13655 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -3760,12 +3760,99 @@ public class ADMLuceneTest extends TestCase
|
|||||||
results = searcher.query(sp);
|
results = searcher.query(sp);
|
||||||
assertEquals(0, results.length());
|
assertEquals(0, results.length());
|
||||||
results.close();
|
results.close();
|
||||||
|
|
||||||
|
|
||||||
sp.addTextAttribute("@" + ContentModel.PROP_CONTENT.toString());
|
sp.addTextAttribute("@" + ContentModel.PROP_CONTENT.toString());
|
||||||
results = searcher.query(sp);
|
results = searcher.query(sp);
|
||||||
assertEquals(1, results.length());
|
assertEquals(1, results.length());
|
||||||
results.close();
|
results.close();
|
||||||
|
|
||||||
|
|
||||||
|
sp = new SearchParameters();
|
||||||
|
sp.addStore(rootNodeRef.getStoreRef());
|
||||||
|
sp.setLanguage("lucene");
|
||||||
|
sp.setQuery("TEXT:\"cabbage\"");
|
||||||
|
sp.addTextAttribute("@" + orderText.toString());
|
||||||
|
results = searcher.query(sp);
|
||||||
|
assertEquals(12, results.length());
|
||||||
|
results.close();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sp = new SearchParameters();
|
||||||
|
sp.addStore(rootNodeRef.getStoreRef());
|
||||||
|
sp.setLanguage("lucene");
|
||||||
|
sp.setQuery("TEXT:\"cab*\"");
|
||||||
|
sp.addTextAttribute("@" + orderText.toString());
|
||||||
|
results = searcher.query(sp);
|
||||||
|
assertEquals(12, results.length());
|
||||||
|
results.close();
|
||||||
|
|
||||||
|
sp = new SearchParameters();
|
||||||
|
sp.addStore(rootNodeRef.getStoreRef());
|
||||||
|
sp.setLanguage("lucene");
|
||||||
|
sp.setQuery("TEXT:\"*bage\"");
|
||||||
|
sp.addTextAttribute("@" + orderText.toString());
|
||||||
|
results = searcher.query(sp);
|
||||||
|
assertEquals(12, results.length());
|
||||||
|
results.close();
|
||||||
|
|
||||||
|
sp = new SearchParameters();
|
||||||
|
sp.addStore(rootNodeRef.getStoreRef());
|
||||||
|
sp.setLanguage("lucene");
|
||||||
|
sp.setQuery("TEXT:\"*ba*\"");
|
||||||
|
sp.addTextAttribute("@" + orderText.toString());
|
||||||
|
results = searcher.query(sp);
|
||||||
|
assertEquals(12, results.length());
|
||||||
|
results.close();
|
||||||
|
|
||||||
|
// term
|
||||||
|
|
||||||
|
sp = new SearchParameters();
|
||||||
|
sp.addStore(rootNodeRef.getStoreRef());
|
||||||
|
sp.setLanguage("lucene");
|
||||||
|
sp.setQuery("TEXT:cabbage");
|
||||||
|
sp.addTextAttribute("@" + orderText.toString());
|
||||||
|
results = searcher.query(sp);
|
||||||
|
assertEquals(12, results.length());
|
||||||
|
results.close();
|
||||||
|
|
||||||
|
sp = new SearchParameters();
|
||||||
|
sp.addStore(rootNodeRef.getStoreRef());
|
||||||
|
sp.setLanguage("lucene");
|
||||||
|
sp.setQuery("TEXT:cab*");
|
||||||
|
sp.addTextAttribute("@" + orderText.toString());
|
||||||
|
results = searcher.query(sp);
|
||||||
|
assertEquals(12, results.length());
|
||||||
|
results.close();
|
||||||
|
|
||||||
|
sp = new SearchParameters();
|
||||||
|
sp.addStore(rootNodeRef.getStoreRef());
|
||||||
|
sp.setLanguage("lucene");
|
||||||
|
sp.setQuery("TEXT:*bage");
|
||||||
|
sp.addTextAttribute("@" + orderText.toString());
|
||||||
|
results = searcher.query(sp);
|
||||||
|
assertEquals(12, results.length());
|
||||||
|
results.close();
|
||||||
|
|
||||||
|
sp = new SearchParameters();
|
||||||
|
sp.addStore(rootNodeRef.getStoreRef());
|
||||||
|
sp.setLanguage("lucene");
|
||||||
|
sp.setQuery("TEXT:*ba*");
|
||||||
|
sp.addTextAttribute("@" + orderText.toString());
|
||||||
|
results = searcher.query(sp);
|
||||||
|
assertEquals(12, results.length());
|
||||||
|
results.close();
|
||||||
|
|
||||||
|
sp = new SearchParameters();
|
||||||
|
sp.addStore(rootNodeRef.getStoreRef());
|
||||||
|
sp.setLanguage("lucene");
|
||||||
|
sp.setQuery("TEXT:dabbage~0.8");
|
||||||
|
sp.addTextAttribute("@" + orderText.toString());
|
||||||
|
results = searcher.query(sp);
|
||||||
|
assertEquals(12, results.length());
|
||||||
|
results.close();
|
||||||
|
|
||||||
// Wild cards in TEXT phrase
|
// Wild cards in TEXT phrase
|
||||||
|
|
||||||
sp = new SearchParameters();
|
sp = new SearchParameters();
|
||||||
|
@@ -346,7 +346,7 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
reader.parse("//" + queryText);
|
reader.parse("//" + queryText);
|
||||||
return handler.getQuery();
|
return handler.getQuery();
|
||||||
}
|
}
|
||||||
else if(field.equals("CLASS"))
|
else if (field.equals("CLASS"))
|
||||||
{
|
{
|
||||||
ClassDefinition target;
|
ClassDefinition target;
|
||||||
if (queryText.startsWith("{"))
|
if (queryText.startsWith("{"))
|
||||||
@@ -682,8 +682,9 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
}
|
}
|
||||||
|
|
||||||
TokenStream source = getAnalyzer().tokenStream(field, new StringReader(queryText));
|
TokenStream source = getAnalyzer().tokenStream(field, new StringReader(queryText));
|
||||||
ArrayList<org.apache.lucene.analysis.Token> v = new ArrayList<org.apache.lucene.analysis.Token>();
|
ArrayList<org.apache.lucene.analysis.Token> list = new ArrayList<org.apache.lucene.analysis.Token>();
|
||||||
org.apache.lucene.analysis.Token t;
|
org.apache.lucene.analysis.Token reusableToken = new org.apache.lucene.analysis.Token();
|
||||||
|
org.apache.lucene.analysis.Token nextToken;
|
||||||
int positionCount = 0;
|
int positionCount = 0;
|
||||||
boolean severalTokensAtSamePosition = false;
|
boolean severalTokensAtSamePosition = false;
|
||||||
|
|
||||||
@@ -691,17 +692,17 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
t = source.next();
|
nextToken = source.next(reusableToken);
|
||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (IOException e)
|
||||||
{
|
{
|
||||||
t = null;
|
nextToken = null;
|
||||||
}
|
}
|
||||||
if (t == null)
|
if (nextToken == null)
|
||||||
break;
|
break;
|
||||||
v.add(t);
|
list.add((org.apache.lucene.analysis.Token) nextToken.clone());
|
||||||
if (t.getPositionIncrement() != 0)
|
if (nextToken.getPositionIncrement() != 0)
|
||||||
positionCount += t.getPositionIncrement();
|
positionCount += nextToken.getPositionIncrement();
|
||||||
else
|
else
|
||||||
severalTokensAtSamePosition = true;
|
severalTokensAtSamePosition = true;
|
||||||
}
|
}
|
||||||
@@ -731,9 +732,9 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
if (Character.isLetterOrDigit(c))
|
if (Character.isLetterOrDigit(c))
|
||||||
{
|
{
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (int j = 0; j < v.size(); j++)
|
for (int j = 0; j < list.size(); j++)
|
||||||
{
|
{
|
||||||
org.apache.lucene.analysis.Token test = v.get(j);
|
org.apache.lucene.analysis.Token test = list.get(j);
|
||||||
if ((test.startOffset() <= i) && (i <= test.endOffset()))
|
if ((test.startOffset() <= i) && (i <= test.endOffset()))
|
||||||
{
|
{
|
||||||
found = true;
|
found = true;
|
||||||
@@ -753,7 +754,9 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
if (pre.length() > 0)
|
if (pre.length() > 0)
|
||||||
{
|
{
|
||||||
// Add new token followed by * not given by the tokeniser
|
// Add new token followed by * not given by the tokeniser
|
||||||
org.apache.lucene.analysis.Token newToken = new org.apache.lucene.analysis.Token(pre.toString(), index - pre.length(), index, "ALPHANUM");
|
org.apache.lucene.analysis.Token newToken = new org.apache.lucene.analysis.Token(index - pre.length(), index);
|
||||||
|
newToken.setTermBuffer(pre.toString());
|
||||||
|
newToken.setType("ALPHANUM");
|
||||||
if (isMlText)
|
if (isMlText)
|
||||||
{
|
{
|
||||||
Locale locale = I18NUtil.parseLocale(localeString);
|
Locale locale = I18NUtil.parseLocale(localeString);
|
||||||
@@ -766,7 +769,7 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
while (it.hasNext())
|
while (it.hasNext())
|
||||||
{
|
{
|
||||||
v.add(it.next());
|
list.add(it.next());
|
||||||
count++;
|
count++;
|
||||||
if (count > 1)
|
if (count > 1)
|
||||||
{
|
{
|
||||||
@@ -778,7 +781,7 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
// content
|
// content
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
v.add(newToken);
|
list.add(newToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -792,9 +795,9 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
if (Character.isLetterOrDigit(c))
|
if (Character.isLetterOrDigit(c))
|
||||||
{
|
{
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (int j = 0; j < v.size(); j++)
|
for (int j = 0; j < list.size(); j++)
|
||||||
{
|
{
|
||||||
org.apache.lucene.analysis.Token test = v.get(j);
|
org.apache.lucene.analysis.Token test = list.get(j);
|
||||||
if ((test.startOffset() <= i) && (i <= test.endOffset()))
|
if ((test.startOffset() <= i) && (i <= test.endOffset()))
|
||||||
{
|
{
|
||||||
found = true;
|
found = true;
|
||||||
@@ -814,7 +817,9 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
if (post.length() > 0)
|
if (post.length() > 0)
|
||||||
{
|
{
|
||||||
// Add new token followed by * not given by the tokeniser
|
// Add new token followed by * not given by the tokeniser
|
||||||
org.apache.lucene.analysis.Token newToken = new org.apache.lucene.analysis.Token(post.toString(), index + 1, index + 1 + post.length(), "ALPHANUM");
|
org.apache.lucene.analysis.Token newToken = new org.apache.lucene.analysis.Token(index + 1, index + 1 + post.length());
|
||||||
|
newToken.setTermBuffer(post.toString());
|
||||||
|
newToken.setType("ALPHANUM");
|
||||||
if (isMlText)
|
if (isMlText)
|
||||||
{
|
{
|
||||||
Locale locale = I18NUtil.parseLocale(localeString);
|
Locale locale = I18NUtil.parseLocale(localeString);
|
||||||
@@ -827,7 +832,7 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
while (it.hasNext())
|
while (it.hasNext())
|
||||||
{
|
{
|
||||||
v.add(it.next());
|
list.add(it.next());
|
||||||
count++;
|
count++;
|
||||||
if (count > 1)
|
if (count > 1)
|
||||||
{
|
{
|
||||||
@@ -839,7 +844,7 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
// content
|
// content
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
v.add(newToken);
|
list.add(newToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -847,7 +852,7 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Collections.sort(v, new Comparator<org.apache.lucene.analysis.Token>()
|
Collections.sort(list, new Comparator<org.apache.lucene.analysis.Token>()
|
||||||
{
|
{
|
||||||
|
|
||||||
public int compare(Token o1, Token o2)
|
public int compare(Token o1, Token o2)
|
||||||
@@ -866,11 +871,11 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
|
|
||||||
// Combined * and ? based strings - should redo the tokeniser
|
// Combined * and ? based strings - should redo the tokeniser
|
||||||
|
|
||||||
// Assue we only string together tokens for the same postion
|
// Assume we only string together tokens for the same position
|
||||||
|
|
||||||
int max = 0;
|
int max = 0;
|
||||||
int current = 0;
|
int current = 0;
|
||||||
for (org.apache.lucene.analysis.Token c : v)
|
for (org.apache.lucene.analysis.Token c : list)
|
||||||
{
|
{
|
||||||
if (c.getPositionIncrement() == 0)
|
if (c.getPositionIncrement() == 0)
|
||||||
{
|
{
|
||||||
@@ -895,7 +900,7 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
{
|
{
|
||||||
org.apache.lucene.analysis.Token replace = null;
|
org.apache.lucene.analysis.Token replace = null;
|
||||||
current = 0;
|
current = 0;
|
||||||
for (org.apache.lucene.analysis.Token c : v)
|
for (org.apache.lucene.analysis.Token c : list)
|
||||||
{
|
{
|
||||||
if (c.getPositionIncrement() == 0)
|
if (c.getPositionIncrement() == 0)
|
||||||
{
|
{
|
||||||
@@ -927,15 +932,21 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
String pre = prefix.toString();
|
String pre = prefix.toString();
|
||||||
if (isMlText)
|
if (isMlText)
|
||||||
{
|
{
|
||||||
int position = c.termText().indexOf("}");
|
String termText = new String(c.termBuffer(), 0, c.termLength());
|
||||||
String language = c.termText().substring(0, position + 1);
|
int position = termText.indexOf("}");
|
||||||
String token = c.termText().substring(position + 1);
|
String language = termText.substring(0, position + 1);
|
||||||
replace = new org.apache.lucene.analysis.Token(language + pre + token, c.startOffset() - pre.length(), c.endOffset(), c.type());
|
String token = termText.substring(position + 1);
|
||||||
|
replace = new org.apache.lucene.analysis.Token(c.startOffset() - pre.length(), c.endOffset());
|
||||||
|
replace.setTermBuffer(language + pre + token);
|
||||||
|
replace.setType(c.type());
|
||||||
replace.setPositionIncrement(c.getPositionIncrement());
|
replace.setPositionIncrement(c.getPositionIncrement());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
replace = new org.apache.lucene.analysis.Token(pre + c.termText(), c.startOffset() - pre.length(), c.endOffset(), c.type());
|
String termText = new String(c.termBuffer(), 0, c.termLength());
|
||||||
|
replace = new org.apache.lucene.analysis.Token(c.startOffset() - pre.length(), c.endOffset());
|
||||||
|
replace.setTermBuffer(pre + termText);
|
||||||
|
replace.setType(c.type());
|
||||||
replace.setPositionIncrement(c.getPositionIncrement());
|
replace.setPositionIncrement(c.getPositionIncrement());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -963,44 +974,60 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
// Does it bridge?
|
// Does it bridge?
|
||||||
if ((pre.length() > 0) && (replace.endOffset() + pre.length()) == c.startOffset())
|
if ((pre.length() > 0) && (replace.endOffset() + pre.length()) == c.startOffset())
|
||||||
{
|
{
|
||||||
|
String termText = new String(c.termBuffer(), 0, c.termLength());
|
||||||
if (isMlText)
|
if (isMlText)
|
||||||
{
|
{
|
||||||
int position = c.termText().indexOf("}");
|
int position = termText.indexOf("}");
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
String language = c.termText().substring(0, position + 1);
|
String language = termText.substring(0, position + 1);
|
||||||
String token = c.termText().substring(position + 1);
|
String token = termText.substring(position + 1);
|
||||||
int oldPositionIncrement = replace.getPositionIncrement();
|
int oldPositionIncrement = replace.getPositionIncrement();
|
||||||
replace = new org.apache.lucene.analysis.Token(replace.termText() + pre + token, replace.startOffset(), c.endOffset(), replace.type());
|
String replaceTermText = new String(replace.termBuffer(), 0, replace.termLength());
|
||||||
|
replace = new org.apache.lucene.analysis.Token(replace.startOffset(), c.endOffset());
|
||||||
|
replace.setTermBuffer(replaceTermText + pre + token);
|
||||||
|
replace.setType(replace.type());
|
||||||
replace.setPositionIncrement(oldPositionIncrement);
|
replace.setPositionIncrement(oldPositionIncrement);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int oldPositionIncrement = replace.getPositionIncrement();
|
int oldPositionIncrement = replace.getPositionIncrement();
|
||||||
replace = new org.apache.lucene.analysis.Token(replace.termText() + pre + c.termText(), replace.startOffset(), c.endOffset(), replace.type());
|
String replaceTermText = new String(replace.termBuffer(), 0, replace.termLength());
|
||||||
|
replace = new org.apache.lucene.analysis.Token(replace.startOffset(), c.endOffset());
|
||||||
|
replace.setTermBuffer(replaceTermText + pre + termText);
|
||||||
|
replace.setType(replace.type());
|
||||||
replace.setPositionIncrement(oldPositionIncrement);
|
replace.setPositionIncrement(oldPositionIncrement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
String termText = new String(c.termBuffer(), 0, c.termLength());
|
||||||
if (isMlText)
|
if (isMlText)
|
||||||
{
|
{
|
||||||
int position = c.termText().indexOf("}");
|
int position = termText.indexOf("}");
|
||||||
String language = c.termText().substring(0, position + 1);
|
String language = termText.substring(0, position + 1);
|
||||||
String token = c.termText().substring(position + 1);
|
String token = termText.substring(position + 1);
|
||||||
org.apache.lucene.analysis.Token last = new org.apache.lucene.analysis.Token(replace.termText() + post, replace.startOffset(), replace.endOffset()
|
String replaceTermText = new String(replace.termBuffer(), 0, replace.termLength());
|
||||||
+ post.length(), replace.type());
|
org.apache.lucene.analysis.Token last = new org.apache.lucene.analysis.Token(replace.startOffset(), replace.endOffset() + post.length());
|
||||||
|
last.setTermBuffer(replaceTermText + post);
|
||||||
|
last.setType(replace.type());
|
||||||
last.setPositionIncrement(replace.getPositionIncrement());
|
last.setPositionIncrement(replace.getPositionIncrement());
|
||||||
fixed.add(last);
|
fixed.add(last);
|
||||||
replace = new org.apache.lucene.analysis.Token(language + pre + token, c.startOffset() - pre.length(), c.endOffset(), c.type());
|
replace = new org.apache.lucene.analysis.Token(c.startOffset() - pre.length(), c.endOffset());
|
||||||
|
replace.setTermBuffer(language + pre + token);
|
||||||
|
replace.setType(c.type());
|
||||||
replace.setPositionIncrement(c.getPositionIncrement());
|
replace.setPositionIncrement(c.getPositionIncrement());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
org.apache.lucene.analysis.Token last = new org.apache.lucene.analysis.Token(replace.termText() + post, replace.startOffset(), replace.endOffset()
|
String replaceTermText = new String(replace.termBuffer(), 0, replace.termLength());
|
||||||
+ post.length(), replace.type());
|
org.apache.lucene.analysis.Token last = new org.apache.lucene.analysis.Token(replace.startOffset(), replace.endOffset() + post.length());
|
||||||
|
last.setTermBuffer(replaceTermText + post);
|
||||||
|
last.setType(replace.type());
|
||||||
last.setPositionIncrement(replace.getPositionIncrement());
|
last.setPositionIncrement(replace.getPositionIncrement());
|
||||||
fixed.add(last);
|
fixed.add(last);
|
||||||
replace = new org.apache.lucene.analysis.Token(pre + c.termText(), c.startOffset() - pre.length(), c.endOffset(), c.type());
|
replace = new org.apache.lucene.analysis.Token(c.startOffset() - pre.length(), c.endOffset());
|
||||||
|
replace.setTermBuffer(pre + termText);
|
||||||
|
replace.setType(c.type());
|
||||||
replace.setPositionIncrement(c.getPositionIncrement());
|
replace.setPositionIncrement(c.getPositionIncrement());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1025,7 +1052,10 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
}
|
}
|
||||||
String post = postfix.toString();
|
String post = postfix.toString();
|
||||||
int oldPositionIncrement = replace.getPositionIncrement();
|
int oldPositionIncrement = replace.getPositionIncrement();
|
||||||
replace = new org.apache.lucene.analysis.Token(replace.termText() + post, replace.startOffset(), replace.endOffset() + post.length(), replace.type());
|
String replaceTermText = new String(replace.termBuffer(), 0, replace.termLength());
|
||||||
|
replace = new org.apache.lucene.analysis.Token(replace.startOffset(), replace.endOffset() + post.length());
|
||||||
|
replace.setTermBuffer(replaceTermText + post);
|
||||||
|
replace.setType(replace.type());
|
||||||
replace.setPositionIncrement(oldPositionIncrement);
|
replace.setPositionIncrement(oldPositionIncrement);
|
||||||
fixed.add(replace);
|
fixed.add(replace);
|
||||||
|
|
||||||
@@ -1053,20 +1083,21 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
v = fixed;
|
list = fixed;
|
||||||
|
|
||||||
if (v.size() == 0)
|
if (list.size() == 0)
|
||||||
return null;
|
return null;
|
||||||
else if (v.size() == 1)
|
else if (list.size() == 1)
|
||||||
{
|
{
|
||||||
t = (org.apache.lucene.analysis.Token) v.get(0);
|
nextToken = (org.apache.lucene.analysis.Token) list.get(0);
|
||||||
if (t.termText().contains("*") || t.termText().contains("?"))
|
String termText = new String(nextToken.termBuffer(), 0, nextToken.termLength());
|
||||||
|
if (termText.contains("*") || termText.contains("?"))
|
||||||
{
|
{
|
||||||
return new org.apache.lucene.search.WildcardQuery(new Term(field, t.termText()));
|
return newWildcardQuery(new Term(field, termText));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return new TermQuery(new Term(field, t.termText()));
|
return newTermQuery(new Term(field, termText));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1076,39 +1107,51 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
if (positionCount == 1)
|
if (positionCount == 1)
|
||||||
{
|
{
|
||||||
// no phrase query:
|
// no phrase query:
|
||||||
BooleanQuery q = new BooleanQuery(true);
|
BooleanQuery q = newBooleanQuery(true);
|
||||||
for (int i = 0; i < v.size(); i++)
|
for (int i = 0; i < list.size(); i++)
|
||||||
{
|
{
|
||||||
t = (org.apache.lucene.analysis.Token) v.get(i);
|
Query currentQuery;
|
||||||
if (t.termText().contains("*") || t.termText().contains("?"))
|
nextToken = (org.apache.lucene.analysis.Token) list.get(i);
|
||||||
|
String termText = new String(nextToken.termBuffer(), 0, nextToken.termLength());
|
||||||
|
if (termText.contains("*") || termText.contains("?"))
|
||||||
{
|
{
|
||||||
org.apache.lucene.search.WildcardQuery currentQuery = new org.apache.lucene.search.WildcardQuery(new Term(field, t.termText()));
|
currentQuery = newWildcardQuery(new Term(field, termText));
|
||||||
q.add(currentQuery, BooleanClause.Occur.SHOULD);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TermQuery currentQuery = new TermQuery(new Term(field, t.termText()));
|
currentQuery = newTermQuery(new Term(field, termText));
|
||||||
q.add(currentQuery, BooleanClause.Occur.SHOULD);
|
|
||||||
}
|
}
|
||||||
|
q.add(currentQuery, BooleanClause.Occur.SHOULD);
|
||||||
}
|
}
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// phrase query:
|
// phrase query:
|
||||||
MultiPhraseQuery mpq = new MultiPhraseQuery();
|
MultiPhraseQuery mpq = newMultiPhraseQuery();
|
||||||
mpq.setSlop(internalSlop);
|
mpq.setSlop(internalSlop);
|
||||||
ArrayList<Term> multiTerms = new ArrayList<Term>();
|
ArrayList<Term> multiTerms = new ArrayList<Term>();
|
||||||
for (int i = 0; i < v.size(); i++)
|
int position = -1;
|
||||||
|
for (int i = 0; i < list.size(); i++)
|
||||||
{
|
{
|
||||||
t = (org.apache.lucene.analysis.Token) v.get(i);
|
nextToken = (org.apache.lucene.analysis.Token) list.get(i);
|
||||||
if (t.getPositionIncrement() == 1 && multiTerms.size() > 0)
|
String termText = new String(nextToken.termBuffer(), 0, nextToken.termLength());
|
||||||
|
if (nextToken.getPositionIncrement() > 0 && multiTerms.size() > 0)
|
||||||
{
|
{
|
||||||
mpq.add((Term[]) multiTerms.toArray(new Term[0]));
|
if (getEnablePositionIncrements())
|
||||||
|
{
|
||||||
|
mpq.add((Term[]) multiTerms.toArray(new Term[0]), position);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mpq.add((Term[]) multiTerms.toArray(new Term[0]));
|
||||||
|
}
|
||||||
multiTerms.clear();
|
multiTerms.clear();
|
||||||
}
|
}
|
||||||
Term term = new Term(field, t.termText());
|
position += nextToken.getPositionIncrement();
|
||||||
if ((t.termText() != null) && (t.termText().contains("*") || t.termText().contains("?")))
|
|
||||||
|
Term term = new Term(field, termText);
|
||||||
|
if ((termText != null) && (termText.contains("*") || termText.contains("?")))
|
||||||
{
|
{
|
||||||
addWildcardTerms(multiTerms, term);
|
addWildcardTerms(multiTerms, term);
|
||||||
}
|
}
|
||||||
@@ -1117,13 +1160,27 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
multiTerms.add(term);
|
multiTerms.add(term);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (multiTerms.size() > 0)
|
if (getEnablePositionIncrements())
|
||||||
{
|
{
|
||||||
mpq.add((Term[]) multiTerms.toArray(new Term[0]));
|
if (multiTerms.size() > 0)
|
||||||
|
{
|
||||||
|
mpq.add((Term[]) multiTerms.toArray(new Term[0]), position);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mpq.add(new Term[] { new Term(field, "\u0000") }, position);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mpq.add(new Term[] { new Term(field, "\u0000") });
|
if (multiTerms.size() > 0)
|
||||||
|
{
|
||||||
|
mpq.add((Term[]) multiTerms.toArray(new Term[0]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mpq.add(new Term[] { new Term(field, "\u0000") });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return mpq;
|
return mpq;
|
||||||
}
|
}
|
||||||
@@ -1132,17 +1189,34 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
{
|
{
|
||||||
MultiPhraseQuery q = new MultiPhraseQuery();
|
MultiPhraseQuery q = new MultiPhraseQuery();
|
||||||
q.setSlop(internalSlop);
|
q.setSlop(internalSlop);
|
||||||
for (int i = 0; i < v.size(); i++)
|
int position = -1;
|
||||||
|
for (int i = 0; i < list.size(); i++)
|
||||||
{
|
{
|
||||||
t = (org.apache.lucene.analysis.Token) v.get(i);
|
nextToken = (org.apache.lucene.analysis.Token) list.get(i);
|
||||||
Term term = new Term(field, t.termText());
|
String termText = new String(nextToken.termBuffer(), 0, nextToken.termLength());
|
||||||
if ((t.termText() != null) && (t.termText().contains("*") || t.termText().contains("?")))
|
Term term = new Term(field, termText);
|
||||||
|
if (getEnablePositionIncrements())
|
||||||
{
|
{
|
||||||
q.add(getMatchingTerms(field, term));
|
position += nextToken.getPositionIncrement();
|
||||||
|
if ((termText != null) && (termText.contains("*") || termText.contains("?")))
|
||||||
|
{
|
||||||
|
q.add(getMatchingTerms(field, term), position);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
q.add(new Term[] { term }, position);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
q.add(term);
|
if ((termText != null) && (termText.contains("*") || termText.contains("?")))
|
||||||
|
{
|
||||||
|
q.add(getMatchingTerms(field, term));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
q.add(term);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return q;
|
return q;
|
||||||
@@ -2035,22 +2109,23 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
private String getToken(String field, String value) throws ParseException
|
private String getToken(String field, String value) throws ParseException
|
||||||
{
|
{
|
||||||
TokenStream source = getAnalyzer().tokenStream(field, new StringReader(value));
|
TokenStream source = getAnalyzer().tokenStream(field, new StringReader(value));
|
||||||
org.apache.lucene.analysis.Token t;
|
org.apache.lucene.analysis.Token reusableToken = new org.apache.lucene.analysis.Token();
|
||||||
|
org.apache.lucene.analysis.Token nextToken;
|
||||||
String tokenised = null;
|
String tokenised = null;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
t = source.next();
|
nextToken = source.next(reusableToken);
|
||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (IOException e)
|
||||||
{
|
{
|
||||||
t = null;
|
nextToken = null;
|
||||||
}
|
}
|
||||||
if (t == null)
|
if (nextToken == null)
|
||||||
break;
|
break;
|
||||||
tokenised = t.termText();
|
tokenised = new String(nextToken.termBuffer(), 0, nextToken.termLength());
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -2073,22 +2148,43 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
}
|
}
|
||||||
else if (field.equals("TEXT"))
|
else if (field.equals("TEXT"))
|
||||||
{
|
{
|
||||||
Collection<QName> contentAttributes = dictionaryService.getAllProperties(DataTypeDefinition.CONTENT);
|
Set<String> text = searchParameters.getTextAttributes();
|
||||||
BooleanQuery query = new BooleanQuery();
|
if ((text == null) || (text.size() == 0))
|
||||||
for (QName qname : contentAttributes)
|
|
||||||
{
|
{
|
||||||
// The super implementation will create phrase queries etc if required
|
Collection<QName> contentAttributes = dictionaryService.getAllProperties(DataTypeDefinition.CONTENT);
|
||||||
Query part = getPrefixQuery("@" + qname.toString(), termStr);
|
BooleanQuery query = new BooleanQuery();
|
||||||
if (part != null)
|
for (QName qname : contentAttributes)
|
||||||
{
|
{
|
||||||
query.add(part, Occur.SHOULD);
|
// The super implementation will create phrase queries etc if required
|
||||||
}
|
Query part = getPrefixQuery("@" + qname.toString(), termStr);
|
||||||
else
|
if (part != null)
|
||||||
{
|
{
|
||||||
query.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.SHOULD);
|
query.add(part, Occur.SHOULD);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
query.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.SHOULD);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BooleanQuery query = new BooleanQuery();
|
||||||
|
for (String fieldName : text)
|
||||||
|
{
|
||||||
|
Query part = getPrefixQuery(fieldName, termStr);
|
||||||
|
if (part != null)
|
||||||
|
{
|
||||||
|
query.add(part, Occur.SHOULD);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
query.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.SHOULD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return query;
|
||||||
}
|
}
|
||||||
return query;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2106,22 +2202,43 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
|
|
||||||
else if (field.equals("TEXT"))
|
else if (field.equals("TEXT"))
|
||||||
{
|
{
|
||||||
Collection<QName> contentAttributes = dictionaryService.getAllProperties(DataTypeDefinition.CONTENT);
|
Set<String> text = searchParameters.getTextAttributes();
|
||||||
BooleanQuery query = new BooleanQuery();
|
if ((text == null) || (text.size() == 0))
|
||||||
for (QName qname : contentAttributes)
|
|
||||||
{
|
{
|
||||||
// The super implementation will create phrase queries etc if required
|
Collection<QName> contentAttributes = dictionaryService.getAllProperties(DataTypeDefinition.CONTENT);
|
||||||
Query part = getWildcardQuery("@" + qname.toString(), termStr);
|
BooleanQuery query = new BooleanQuery();
|
||||||
if (part != null)
|
for (QName qname : contentAttributes)
|
||||||
{
|
{
|
||||||
query.add(part, Occur.SHOULD);
|
// The super implementation will create phrase queries etc if required
|
||||||
}
|
Query part = getWildcardQuery("@" + qname.toString(), termStr);
|
||||||
else
|
if (part != null)
|
||||||
{
|
{
|
||||||
query.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.SHOULD);
|
query.add(part, Occur.SHOULD);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
query.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.SHOULD);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BooleanQuery query = new BooleanQuery();
|
||||||
|
for (String fieldName : text)
|
||||||
|
{
|
||||||
|
Query part = getWildcardQuery(fieldName, termStr);
|
||||||
|
if (part != null)
|
||||||
|
{
|
||||||
|
query.add(part, Occur.SHOULD);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
query.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.SHOULD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return query;
|
||||||
}
|
}
|
||||||
return query;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2139,22 +2256,43 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
|
|
||||||
else if (field.equals("TEXT"))
|
else if (field.equals("TEXT"))
|
||||||
{
|
{
|
||||||
Collection<QName> contentAttributes = dictionaryService.getAllProperties(DataTypeDefinition.CONTENT);
|
Set<String> text = searchParameters.getTextAttributes();
|
||||||
BooleanQuery query = new BooleanQuery();
|
if ((text == null) || (text.size() == 0))
|
||||||
for (QName qname : contentAttributes)
|
|
||||||
{
|
{
|
||||||
// The super implementation will create phrase queries etc if required
|
Collection<QName> contentAttributes = dictionaryService.getAllProperties(DataTypeDefinition.CONTENT);
|
||||||
Query part = getFuzzyQuery("@" + qname.toString(), termStr, minSimilarity);
|
BooleanQuery query = new BooleanQuery();
|
||||||
if (part != null)
|
for (QName qname : contentAttributes)
|
||||||
{
|
{
|
||||||
query.add(part, Occur.SHOULD);
|
// The super implementation will create phrase queries etc if required
|
||||||
}
|
Query part = getFuzzyQuery("@" + qname.toString(), termStr, minSimilarity);
|
||||||
else
|
if (part != null)
|
||||||
{
|
{
|
||||||
query.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.SHOULD);
|
query.add(part, Occur.SHOULD);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
query.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.SHOULD);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BooleanQuery query = new BooleanQuery();
|
||||||
|
for (String fieldName : text)
|
||||||
|
{
|
||||||
|
Query part = getFuzzyQuery(fieldName, termStr, minSimilarity);
|
||||||
|
if (part != null)
|
||||||
|
{
|
||||||
|
query.add(part, Occur.SHOULD);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
query.add(new TermQuery(new Term("NO_TOKENS", "__")), Occur.SHOULD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return query;
|
||||||
}
|
}
|
||||||
return query;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2310,7 +2448,8 @@ public class LuceneQueryParser extends QueryParser
|
|||||||
{
|
{
|
||||||
while ((t = duplicator.next()) != null)
|
while ((t = duplicator.next()) != null)
|
||||||
{
|
{
|
||||||
Query subQuery = subQueryBuilder.getQuery(expandedFieldName, t.termText());
|
String termText = new String(t.termBuffer(), 0, t.termLength());
|
||||||
|
Query subQuery = subQueryBuilder.getQuery(expandedFieldName, termText);
|
||||||
booleanQuery.add(subQuery, Occur.SHOULD);
|
booleanQuery.add(subQuery, Occur.SHOULD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user