当前位置: 首页 > 知识库问答 >
问题:

Lucene对已存储和未存储字段的并发搜索

段干河
2023-03-14
try (InputStream stream = Files.newInputStream(file)) {

            // create empty document
            Document doc = new Document();

            // add the last modification time field
            Field lastModField = new StoredField(LuceneConstants.LAST_MODIFICATION_TIME, Files.getAttribute(file, "lastModifiedTime", LinkOption.NOFOLLOW_LINKS).toString());
            doc.add(lastModField);
            
            // add the path Field
            Field pathField = new StringField(LuceneConstants.FILE_PATH, file.toString(), Field.Store.YES);
            doc.add(pathField);

            // add the name Field
            doc.add(new StringField(LuceneConstants.FILE_NAME, file.getFileName().toString(), Field.Store.YES));

            // add the content
            doc.add(new TextField(LuceneConstants.CONTENTS, new BufferedReader(new InputStreamReader(stream))));

            System.out.println("adding " + file);
            writer.addDocument(doc);

现在,据我所知,我必须使用两个QueryParser,因为我需要使用两个不同的分析器来搜索两个字段,每个字段一个。我想不出怎么把它们结合起来。我想要的是一个TopDoc,其中的结果是排序的相关性得分,这是一些组合的2相关性得分从搜索的文件名字段和搜索的内容字段。Lucene7.4是否为您提供了轻松解决此问题的方法?

附:这是我很长一段时间以来的第一个帖子,如果不是永远的话。请注明任何格式或内容问题。

编辑:用于索引内容字段和搜索内容字段的分析器:

Analyzer myTxtAnalyzer = CustomAnalyzer.builder()
                    .withTokenizer("standard")
                    .addTokenFilter("lowercase")
                    .addTokenFilter("stop")
                    .addTokenFilter("porterstem")
                    .build();

我是一个计算机科学的学生,这是我与Lucene的第一个项目。如果没有可用的功能,这一切都很好。我要求的不是我任务的要求。我只是在思考,我觉得这是一个可能已经存在的简单解决方案。但我似乎找不到它,如果它存在的话。

编辑2:我有一个误解,但是当使用Stored时会发生什么。是/。不。我的问题与此无关。字符串没有标记化,因为它在StringField中。我以为是因为它被储存了。然而,我的问题仍然存在。是否有一种方法可以同时搜索标记化和未标记化的字段?

共有1个答案

羊舌胡非
2023-03-14

正如@AndrewJames提到的,在示例中不需要使用多个分析器,因为只有TextField会得到分析,而StringField不会得到分析。如果您需要为不同的字段使用不同的分析器,那么Lucene可以适应这种情况。为此,您可以使用PerfieldAnalyzerWrapper,它基本上可以指定一个默认分析器,然后指定任意多个特定于字段的分析器(作为字典传递给PerfieldAnalyzerWrapper)。然后,在分析文档时,如果指定了特定于字段的分析器,则使用特定于字段的分析器;如果没有,则使用为PerFieldAnalyzerWrapper指定的默认分析器。

无论是使用单个分析器还是通过PerfieldAnalyzerWrapper使用多个分析器,您只需要一个QueryParser,您将传递给该分析器一个分析器或PerfieldAnalyzerWrapper,后者是一个包装多个分析器的分析器。

有些字段已存储,有些字段未存储,这一事实对搜索它们没有影响。对于搜索来说,唯一重要的是该字段被索引,StringFieldTextField总是被索引。

你提到以下内容:

我正在使用KeywordAnalyzer搜索文件名字段,重申一下,该字段是存储的,所以不进行分析。

是否存储字段与是否分析字段无关。对于filename字段,代码使用stringfieldfield.store.yes。因为它是stringfield,所以它将被索引但不被分析,而且因为您指定要存储字段,所以它将被存储。因此,由于该字段没有被分析,因此它不会使用keywordanalyzer或任何其他分析器:-)

 类似资料:
  • 问题内容: 在文档中,某些类型(例如数字和日期)指定存储默认为no。但是该字段仍然可以从json中检索。 令人困惑。这是否表示_source? 有没有办法根本不存储字段,而只是对其建立索引并进行搜索? 问题答案: 默认情况下,不存储任何字段类型。只有领域。这意味着您始终可以取回发送给搜索引擎的内容。即使您要求特定的字段,elasticsearch也会为您解析该字段并将其退还给您。 您可以根据需要禁

  • 我已经通过了lucene索引机制。我有一些疑问,我找不到一个直截了当的答案,我仍然对我在几篇参考文献中的阅读感到困惑。 考虑使用Lucene对数据库表进行索引。 假设该表有10列,其中很少有caseid、modifiedby、modifiedtime、casename、legalname等。。。 现在,如果我创建一个索引的情况下,那么在搜索是不是可以搜索的基础上修改字段??? 假设我在2列case

  • 我有两个类,有两个单独的表,“员工”和“公司”。我想在Company类中保留一个员工列表。这很容易,但我不知道如何在数据库端表示此列表。 “公司”类别: 类“员工”: 如果没有hibernate,我会选择创建另一个包含两列“employeeId”和“companyId”的表的设计,并尝试让所有员工的“employeeId”与“companyId”匹配。我不知道是否有可能在冬眠时做同样的事情。如果是

  • 我正在尝试对弹性搜索聚合的结果桶进行排序。我有一大套文件: 我目前正在做的是使用top_hits聚合获取每个的最新销售: 现在,我想按任意字段对生成的bucket进行排序。如果我想按排序,我可以使用这个问题的解决方案,添加一个aggregation,它从每个bucket中提取 字段,最后添加一个 的字母顺序排序,我不能使用< code>max聚合,因为它只对数值字段有效。 如何按文本字段对存储桶(

  • 这两个URL之间有区别吗?一个直接指向mp4,然后另一个URL是“下载链接”?有区别吗? 在谷歌云平台中有这样存储文件的选项吗?

  • 问题内容: 我正在尝试优化我的Elasticsearch方案。 我有一个URL字段-我不想查询或过滤它,而只是检索它。 我的理解是,定义为的字段未建立索引,但仍存储在索引中。(请参阅http://www.slideshare.net/nitin_stephens/lucene- basics中的 幻灯片5 )这应该与Lucene UnIndexed相匹配,对吗? 这使我感到困惑,是否有一种方法可以