gpt4 book ai didi

java - 使用 SolR 的不同类型术语构建查询

转载 作者:行者123 更新时间:2023-12-01 13:14:59 27 4
gpt4 key购买 nike

我有一个 Web 应用程序,可以通过 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"

根据示例,我的网络应用程序应该能够搜索:

确切条款:“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 字符串,这将为您对其进行编码( self 推销:如果您有兴趣,我有一个 library to do that )。

第二种是使用Guava 15.0+,它有一个set of escapers especially made for URLs .

关于java - 使用 SolR 的不同类型术语构建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22540518/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com