如何在lucene中搜索字段只有一个令牌

时间:2017-07-29 17:12:23

标签: lucene

我正在创建一个索引,其中文档只是一个单词。 我正在索引域名,因此字段“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”令牌的文档。

鉴于这个场景,我该如何搜索?

1 个答案:

答案 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

以上示例实际上并不是您应该如何执行此操作。我测试了它,它甚至没有真正起作用。您要做的是构建专门的查询,例如PrefixQueryWildcardQueryRegexpQuery

此外,如果您没有使用QueryParser或带有Analyzer的内容,则查询必须与索引中的内容完全匹配。如果域名是TextField,它可能已经小写或者发生了其他事情,那么您也需要知道它。

我只是使用正则表达式。

RegExp r = new RegExp("this.*cool");
Query q = new RegexpQuery(new Term("domain", r.toString()));

它可能很慢,但如果你没有any char的前缀,它应该是完全正常的。我也不完全确定如何忽略这种情况,但这可能是默认的。