Lucene:如何按特定术语搜索
Lucene: How to search by specific term
我正在尝试通过特定的字符串术语进行 Lucene 搜索。
例如:我有标签 1-“Hello World”,2-“Hello, Steve”,3-“Helloween”,最后是 4-“Hello”,如果我查找最后一个标签 (hello),Lucene 将带来所有标签,因为他们所有人都在某个时候说了“你好”。我需要一个运算符或逻辑来进行搜索而不需要“喜欢”。
有一种方法可以使用子句“must_not”(- 运算符)来避免这种情况,查询将是:
term:hello -term:world
。但事实并非如此,因为我需要找到所有其他不应该在搜索中的词。
private <T> Query createQuery(final Class<T> clazz, String s, final String[] fields, final SearchFactory searchFactory, final Boolean allowLeadingWildcard) throws ParseException {
final Analyzer analyzer = searchFactory.getAnalyzer(clazz);
final QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, fields, analyzer);
Query query = null;
try{
query = parser.parse(s);
} catch(...){...}
return query;
我对 Lucene 的了解很短,所以我将放置一个 SQL 示例,看看是否更容易理解
/*This is what Lucene is doing. It will bring "HELLO", "HELLO WORLD", "Hello, Steve"...*/
WHERE table.tag LIKE "%HELLO%"
/*This is what I want. Match exactly the term "HELLO" and nothing more*/
WHERE table.tag = "HELLO"
我猜这是应用程序中使用的分析器:
public class AnalyserCustom extends Analyzer {
@Override
public TokenStream tokenStream(final String fieldName, final Reader reader) {
final StandardTokenizer tokenizer = new StandardTokenizer(Version.LUCENE_36, reader);
TokenStream stream = new StandardFilter(Version.LUCENE_36, tokenizer);
stream = new LowerCaseFilter(Version.LUCENE_36, stream);
return new ASCIIFoldingFilter(stream);
}
}
属性TAG是这样的:
...
@Field
private String tagname;
...
有什么建议吗?
PS:我是 Lucene 新手。
您必须使用索引字段,这将为搜索的字符串生成一个特定的标记,请尝试使用 KeywordAnalyzer。
我正在尝试通过特定的字符串术语进行 Lucene 搜索。
例如:我有标签 1-“Hello World”,2-“Hello, Steve”,3-“Helloween”,最后是 4-“Hello”,如果我查找最后一个标签 (hello),Lucene 将带来所有标签,因为他们所有人都在某个时候说了“你好”。我需要一个运算符或逻辑来进行搜索而不需要“喜欢”。
有一种方法可以使用子句“must_not”(- 运算符)来避免这种情况,查询将是:
term:hello -term:world
。但事实并非如此,因为我需要找到所有其他不应该在搜索中的词。
private <T> Query createQuery(final Class<T> clazz, String s, final String[] fields, final SearchFactory searchFactory, final Boolean allowLeadingWildcard) throws ParseException {
final Analyzer analyzer = searchFactory.getAnalyzer(clazz);
final QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, fields, analyzer);
Query query = null;
try{
query = parser.parse(s);
} catch(...){...}
return query;
我对 Lucene 的了解很短,所以我将放置一个 SQL 示例,看看是否更容易理解
/*This is what Lucene is doing. It will bring "HELLO", "HELLO WORLD", "Hello, Steve"...*/
WHERE table.tag LIKE "%HELLO%"
/*This is what I want. Match exactly the term "HELLO" and nothing more*/
WHERE table.tag = "HELLO"
我猜这是应用程序中使用的分析器:
public class AnalyserCustom extends Analyzer {
@Override
public TokenStream tokenStream(final String fieldName, final Reader reader) {
final StandardTokenizer tokenizer = new StandardTokenizer(Version.LUCENE_36, reader);
TokenStream stream = new StandardFilter(Version.LUCENE_36, tokenizer);
stream = new LowerCaseFilter(Version.LUCENE_36, stream);
return new ASCIIFoldingFilter(stream);
}
}
属性TAG是这样的:
...
@Field
private String tagname;
...
有什么建议吗?
PS:我是 Lucene 新手。
您必须使用索引字段,这将为搜索的字符串生成一个特定的标记,请尝试使用 KeywordAnalyzer。