我有一个Webapp,可以通过SolR上的url查询执行搜索。
结果作为Document对象接收。
我的查询看起来像:q=Book:Harlan AND Book:Coben AND ..
,它工作正常。
String[] word = searchedWord.trim().split(" ");
for (int i = 0; i < word.length; i++) {
if (!StringUtils.isEmpty(word[i])) {
if (i > 0) {
query.append("%20AND%20");
}
String utf_encoded = URLEncoder.encode(StringEscapeUtils.escapeJava(word[i]), "UTF-8");
}
}
但是我需要强制执行搜索词的种类,因为当搜索词就像一个精确词:
"Harlan Coben"
时,此代码将其分为两个词"Harlan
和Coben"
例如,我的Web应用程序应该可以搜索:
确切术语:
"Harlan Coben"
多个术语:
shakespeare harlan coben
多个混合术语:
shakespeare "harlan coben" coben
或shakespear "harlan coben"
或"harlan coben" coben
调用SolR的URL以UTF-8编码,以替换特殊字符。
我应该如何进行?用正则表达式表示吗?还是有另一种方法?
------编辑--------
更具体地说,所有这些字符都可以是“ @(!ùéàç”)或中文/俄文,也可以是特定语言中的其他任何字符(unicode?)。
我需要将它们匹配并分开以准备SolR查询。
例:
如果搜索词是:
coben "Harlan Coben" s(554603)hakesdpeare Straße Привет
我的正则表达式应该匹配并给我以下结果:
coben
"Harlan Coben"
s(554603)hakesdpeare
Straße
Привет
然后,我需要使用
AND Book:
或juste Book:
将它们中的每一个连接起来,以进行如下查询:q=Book:coben AND Book:"Harlan Coben" AND Book:s(554603)hakesdpeare AND Book:Straße AND Book:Привет
我尝试了@fge的
("[a-z]+(?:\s+[a-z]+)+"|[a-z]+)(?:\s+|$)
(为此),但是它仅与[a-z]匹配,我尝试了\\p{all}
的方法,但是没有用。任何的想法 ?
------结束编辑--------
感谢帮助 !
最佳答案
您可以使用正则表达式,但是它会非常复杂。在这种情况下,您需要进行交替。这里假设您的搜索词中只有字母:
("[a-z]+(?:\s+[a-z]+)+"|[a-z]+)(?:\s+|$)
(请注意,交替顺序在这里很重要!)
例:
public final class Bar
{
private static final Pattern PATTERN = Pattern
.compile("(\"[a-z]+(?:\\s+[a-z]+)+\"|[a-z]+)(?:\\s+|$)",
Pattern.CASE_INSENSITIVE);
public static void main(final String... args)
throws IOException
{
tryAndMatch("\"Harlan Coben\"");
tryAndMatch("shakespeare harlan coben");
tryAndMatch("shakespeare \"harlan coben\" coben");
}
private static void tryAndMatch(final String input)
{
final Matcher m = PATTERN.matcher(input);
System.out.printf("INPUT: -->%s<--\n", input);
while (m.find())
System.out.printf("Term -->%s<--\n", m.group(1));
System.out.println("END INPUT");
}
}
现在,关于替换为URL,请注意,不是将
URLEncoder
编码为URL组件,而是将其编码为application/x-www-form-urlencoded
数据,其中空格变为+
,并且没有相同的转义字符集而不是URI路径或片段。最准确的解决方案是使用URI模板。这使您可以编写模板,例如:
http://my.site/?q={query}
其中
query
是任何Unicode字符串,它将为您编码(自我推广:如果您有兴趣,我有一个library to do that)。第二个是使用Guava 15.0+,它有一个set of escapers especially made for URLs。