如何自动将所有 Lucene TermQuery 对象转换为 PrefixQuery?
How can I automatically convert all Lucene TermQuery objects to PrefixQuery?
我正在使用 QueryParser
和 StandardAnalyzer
来解析 queryString。使用此设置,如果我搜索 "key short"
,它将不会匹配文本 "keyboard shortcut"
。
我认为这是因为 queryString "key short"
被解析为 BooleanQuery(TermQuery("key"), TermQuery("short"))
。如果我想让它匹配 "keyboard shortcut"
,我必须搜索 "key* short*"
。我希望 QueryParser 自动为我执行此操作,即在给定 queryString "key short"
时生成:BooleanQuery(PrefixQuery("key"), PrefixQuery("short"))
。
这是正确的方法吗?如果是这样,我应该怎么做?
我从未找到 'proper' 解决方案,所以我实施了一个 hack,将通配符附加到原始查询中的各个单词,然后将其提供给分析器:
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("*"),
queryString);
Query query = new QueryParser(CONTENTS_FIELD, analyzer).parse(processedQuery);
我正在使用 QueryParser
和 StandardAnalyzer
来解析 queryString。使用此设置,如果我搜索 "key short"
,它将不会匹配文本 "keyboard shortcut"
。
我认为这是因为 queryString "key short"
被解析为 BooleanQuery(TermQuery("key"), TermQuery("short"))
。如果我想让它匹配 "keyboard shortcut"
,我必须搜索 "key* short*"
。我希望 QueryParser 自动为我执行此操作,即在给定 queryString "key short"
时生成:BooleanQuery(PrefixQuery("key"), PrefixQuery("short"))
。
这是正确的方法吗?如果是这样,我应该怎么做?
我从未找到 'proper' 解决方案,所以我实施了一个 hack,将通配符附加到原始查询中的各个单词,然后将其提供给分析器:
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("*"),
queryString);
Query query = new QueryParser(CONTENTS_FIELD, analyzer).parse(processedQuery);