【问题标题】:Lucene: How to search by specific termLucene:如何按特定词搜索
【发布时间】:2021-10-27 12:40:06
【问题描述】:

我正在尝试按特定的字符串术语进行 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 的新手。

【问题讨论】:

  • 我错过了你最后一句“我需要找到所有其他不应该在搜索中的单词。”你能澄清一下这是什么意思吗?你可以edit这个问题 - 更多的例子可能会有所帮助。
  • 例如...如果我有标签 1-“Hello World”、2-“Hello, Steve”、3-“Helloween”,最后是 4-“Hello”,如果我查找最后一个标签(hello),Lucene 会带上所有的标签,因为它们在某个时候都带有“hello”。我需要一个运算符或逻辑,使搜索没有“喜欢”。
  • 你能编辑你的问题并将这个新例子放在那里吗?您能否准确地展示您想要获得的结果,以及您目前获得的结果?很抱歉推动这一点,但我不明白您所说的 运算符或在没有“like”的情况下进行搜索的逻辑 是什么意思 - 以及它如何转化为最终结果的样子。
  • 另外,您使用的是什么分析器,索引数据时会创建哪些类型的字段?显示相关代码可能是最简单的。所有这些都会对查询的行为产生重大影响。
  • 我添加了一些代码。如果有帮助,请告诉我。

标签: java search indexing lucene


【解决方案1】:

您必须使用索引字段,这将为搜索的字符串生成一个特定的标记,请尝试使用 KeywordAnalyzer

【讨论】:

  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
  • 使用注释@Analyzer(impl = KeywordAnalyzer.class) 工作正常。但现在我必须重新索引所有数据。
猜你喜欢
  • 2016-07-30
  • 2014-04-19
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多