我有一个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"时,此代码将其分为两个词"HarlanCoben"

例如,我的Web应用程序应该可以搜索:

确切术语:"Harlan Coben"

多个术语:shakespeare harlan coben

多个混合术语:shakespeare "harlan coben" cobenshakespear "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

07-24 16:07