我已将一些维基百科网址以及这些网页的内容编入索引。我希望能够同时搜索这两个字段,或只搜索一个字段,并附加选项以允许任何给定字段上的通配符(虽然我不确定是否会使用通配符选项内容输入),所以我不仅可以找到
https://en.wikipedia.org/wiki/Polish_songs_(Chopin)
但我也可以找到
https://en.wikipedia.org/wiki/Fr%C3%A9d%C3%A9ric_Chopin
我有Lucene版本7.1.0并且无法完全掌握文档,因此我对SO进行了彻底搜索,并将我的代码基于以下Q& A(主要来自旧的Lucene版本,但功能性)似乎是一样的):
Exact Phrase search using Lucene?
How to do a Multi field - Phrase search in Lucene?
How to match exact text in Lucene search?
根据上面的答案,我想出了一些关于如何使用以下输入进行搜索的想法:
假设:
Query q;
QueryParser qp;
/* I think this is fishy but do not know how to do it differently */
if (contentOnlySearch) {
qp = new QueryParser("content", analyzer);
} else {
qp = new QueryParser("url", analyzer);
}
/* end */
String urlQuery = "chopin";
String contentQuery = "polish songs that chopin wrote";
if (allowUrlQueryWildcards) {
urlQuery = "*" + urlQuery + "*";
}
if (allowContentQueryWildcards) {
contentQuery = "*" + contentQuery + "*";
}
创意1:
q = MultiFieldQueryParser.parse(
new String[] {urlQuery, contentQuery},
new String[] {"url", "content"},
analyzer
);
创意2:
q = qp.parse("url:\"" + urlQuery + "\" AND content:\"" + contentQuery + "\"");
1。现在,这些方法和其他一些方法都失败了,我要么得到一个错误,要么经常找到一个不包含输入contentQuery的网站。我做错了什么?
附带问题:
2。如果我保存了大约10000个URL,那么允许通配符在这里是一个很好的选择,或者我应该稍微调整索引/搜索过程,以便能够通过输入" Chopin"来找到这两个URL?
第3。为什么lucene找到并索引"肖邦"在"(肖邦)",但不在" _Chopin"?
PS。我来自JavaScript,我希望我的Java代码是正确的,不会让你的眼睛流血。