我正在创建一个索引,其中文档只是一个单词。 我正在索引域名,因此字段“domain”看起来像:
example.com
thisiscool.com
justtesting.org
cnn.com
我正在以编程方式创建我的搜索条件等,因为我的所有文档字段只是一个单独的术语,看起来好像我的搜索不能正常工作,因为只有一个术语,如果我添加多个布尔查询中的术语永远不会找到任何东西。
考虑到我只有一个学期,我应该怎么搜索?我希望尽可能提高效率。
Query term = new TermQuery("domain", "this")
Query term2 = new TermQuery("domain", "cool")
// add to boolean query
bq.add(term, Occur.MUST)
bq.add(term2, Occur.MUST)
indexSearcher.search(bq, 100)
我本来希望得到“thisiscool.com”,但我得到了0次点击。我的猜测是因为lucene无法将事情分解为令牌,因此它永远不会找到任何具有“this”和“cool”令牌的文档。
鉴于这个场景,我该如何搜索?
答案 0 :(得分:1)
将通配符应用于搜索子句。
Query term = new TermQuery("domain", "this*");
Query term2 = new TermQuery("domain", "cool*"); // *cool* won't work sadly
然而,这可能不起作用,因为逻辑将导致这样的查询,其中域必须以“this”以及“cool”开头
bq.add(term, Occur.MUST)
bq.add(term2, Occur.MUST)
=> +domain:this* +domain:cool*
Query term = new TermQuery("domain", "this*cool*");
=> +domain:this*cool* // probably gets hits
如果您使用的是较新版本,则可以在查询中使用正则表达式:
http://lucene.apache.org/core/6_6_0/core/org/apache/lucene/util/automaton/RegExp.html
以上示例实际上并不是您应该如何执行此操作。我测试了它,它甚至没有真正起作用。您要做的是构建专门的查询,例如PrefixQuery
,WildcardQuery
或RegexpQuery
。
此外,如果您没有使用QueryParser
或带有Analyzer
的内容,则查询必须与索引中的内容完全匹配。如果域名是TextField
,它可能已经小写或者发生了其他事情,那么您也需要知道它。
我只是使用正则表达式。
RegExp r = new RegExp("this.*cool");
Query q = new RegexpQuery(new Term("domain", r.toString()));
它可能很慢,但如果你没有any char
的前缀,它应该是完全正常的。我也不完全确定如何忽略这种情况,但这可能是默认的。