我将QueryParser
与StandardAnalyzer
结合使用来解析queryString。使用此设置,如果我搜索"key short"
,它将与文本"keyboard shortcut"
不匹配。
我认为这是因为queryString "key short"
被解析为BooleanQuery(TermQuery("key"), TermQuery("short"))
。如果我希望它匹配"keyboard shortcut"
,则必须搜索"key* short*"
。我希望QueryParser自动为我执行此操作,即在给定queryString BooleanQuery(PrefixQuery("key"), PrefixQuery("short"))
时产生:"key short"
。
这是正确的方法吗?如果是这样,我应该怎么做?
我从来没有找到解决这个问题的“合适的”解决方案,所以我实现了一种将通配符附加到原始查询中的各个单词,然后将其提供给分析器的黑客:
private static final Pattern QUERY_WORD_PATTERN = Pattern.compile("(?<= |^)(?!AND|OR)(\\w+)(?= |$)");
...
String processedQuery = String.format("%s OR %s",
QUERY_WORD_PATTERN.matcher(queryString).replaceAll("$1*"),
queryString);
Query query = new QueryParser(CONTENTS_FIELD, analyzer).parse(processedQuery);