【问题标题】:Lucene is not returning the results if I am searching with special characters如果我使用特殊字符进行搜索,Lucene 不会返回结果
【发布时间】:2022-07-21 21:40:15
【问题描述】:

我正在使用 Lucene 6.6.0 版本,并且正在使用 StandardAnalyzer 为我的数据编制索引。

我正在索引以下单词数据。

  1. a&e 网络
  2. a&e

索引后,当我使用 a&e 进行搜索时,它不会返回任何结果。 这是我的示例代码。

    Directory dir = new RAMDirectory();
    IndexWriterConfig iwc = new IndexWriterConfig(new StandardAnalyzer());
    iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
    IndexWriter writer = new IndexWriter(dir, iwc);

    Document doc = new Document();
    doc.add(new TextField("text", "a&e networks", Field.Store.YES));
    writer.addDocument(doc);
    doc = new Document();
    doc.add(new TextField("text", "a&e", Field.Store.YES));
    writer.addDocument(doc);
    writer.close();

    IndexReader reader = DirectoryReader.open(dir);

    IndexSearcher searcher = new IndexSearcher(reader);

    Query query = new TermQuery(new Term("text", "a&e"));

    TopDocs results = searcher.search(query, 5);
    final ScoreDoc[] scoreDocs = results.scoreDocs;
    for (ScoreDoc scoreDoc : scoreDocs) {
        System.out.println(scoreDoc.doc + " " + scoreDoc.score + " " + searcher.doc(scoreDoc.doc).get("text"));
    }
    System.out.println("Hits: " + results.totalHits);
    System.out.println("Max score:" + results.getMaxScore());

我得到的输出为 点击次数:0 最高分:NaN

即使我正在搜索 a,在这种情况下也没有给出任何结果。

但是如果我像这样添加设置为 StandardAnalyzer 的停用词

    List<String> stopWords = Arrays.asList("&");
    CharArraySet stopSet = new CharArraySet(stopWords, false);
    IndexWriterConfig iwc = new IndexWriterConfig(new StandardAnalyzer(stopSet));

然后如果我搜索 a 然后我就能得到结果。但即使在这种情况下,如果我搜索 a&e ,我也没有得到任何结果。

请建议我如何实现这一点,我的目标是如果我搜索 a&e 我应该能够得到结果。我需要任何 CustomAnalyzer 吗?如果是,请说明我应该在 CustomAnalyzer 中添加什么?

【问题讨论】:

    标签: java lucene special-characters


    【解决方案1】:

    可能&amp; 字符被认为是单词边界:

    https://lucene.apache.org/core/6_6_0/core/org/apache/lucene/analysis/standard/StandardTokenizer.html

    此类实现 Unicode 文本分割算法中的分词规则,如 Unicode 标准附件 #29 中所指定。

    ae 可能被视为停用词。因此,当被索引时,它们会被删除。

    您可以尝试一些由&amp; 字符分隔的随机生成的关键字(例如,adsadaerewfds&eqeqwedasd)。索引后尝试在&amp; 之前和之后搜索关键字。如果找到这些关键字,要么存储它们而不进行分析(您可以使用StringField)或创建自定义分析器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多