如何在lucene中搜索一个字段只有一个标记的情况

如何在lucene中搜索一个字段只有一个标记的情况,lucene,Lucene,我正在创建一个索引,其中文档只是一个术语。 我正在为域名编制索引,因此“域”字段如下所示: example.com thisiscool.com justtesting.org cnn.com 我正在以编程方式创建搜索词等,因为我的所有文档字段都只是一个词,所以我的搜索似乎无法正常工作,因为只有一个词,如果我在布尔查询中添加多个词,它将永远找不到任何内容 如果我只有一个术语,我应该如何搜索?我希望尽可能提高效率。 Query term = new TermQuery("domain", "th

我正在创建一个索引,其中文档只是一个术语。 我正在为域名编制索引,因此“域”字段如下所示:

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”的文档

鉴于此场景,我应该如何搜索?

对搜索子句应用通配符

Query term = new TermQuery("domain", "this*");
Query term2 = new TermQuery("domain", "cool*"); // *cool* won't work sadly
但是,这可能不起作用,因为逻辑将导致这样的查询,其中域必须以“this”和“cool”开头

如果您使用的是较新版本,则可以在查询中使用正则表达式:


上面的例子并不是你应该怎么做。我测试过了,但它根本不起作用。您要做的是构建专门的查询,例如
PrefixQuery
WildcardQuery
RegexpQuery

此外,如果您没有使用
QueryParser
或使用
分析器的东西,查询必须与索引中的内容完全匹配。若域是一个
TextField
,那个么它可能是小写的,或者发生了其他事情,所以你们也需要知道这一点

我就用正则表达式

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

它可能很慢,但如果您不使用
any char
作为前缀,它应该很好。我也不完全确定如何在这种情况下忽略大小写,但这可能是默认情况。

我建议在这种情况下结合使用前缀查询和布尔查询。你自己添加通配符对我来说似乎不太合适。@dom你说得对,实际上我在这里有点困惑。我将编辑我的答案。
RegExp r = new RegExp("this.*cool");
Query q = new RegexpQuery(new Term("domain", r.toString()));