Lucene 4.2 字符串字段

2023-12-11

我是 Lucene 的新手。我有两个文档,我希望与称为“关键字”的文档字段完全匹配(该字段可能在文档中出现多次)。

第一个文档包含关键字“Annotation is Cool”。第二个文档包含关键字“注释也很酷”。当我搜索“注释很酷”时,如何构建查询以便仅找到第一个文档?

我读到了一些关于“StringField”的内容,并且它没有被标记化。如果我在方法“addDoc”中将“关键字”字段从“TextField”更改为“StringField”,则什么也找不到。

这是我的代码:

private IndexWriter writer;

public void lucene() throws IOException, ParseException {
    // Build the index
    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_42);
    Directory index = new RAMDirectory();
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42,
            analyzer);
    this.writer = new IndexWriter(index, config);

    // Add documents to the index
    addDoc("Spring", new String[] { "Java", "JSP",
            "Annotation is cool" });
    addDoc("Java", new String[] { "Oracle", "Annotation is cool too" });

    writer.close();

    // Search the index
    IndexReader reader = DirectoryReader.open(index);
    IndexSearcher searcher = new IndexSearcher(reader);

    BooleanQuery qry = new BooleanQuery();

    qry.add(new TermQuery(new Term("keyword", "\"Annotation is cool\"")), BooleanClause.Occur.MUST);

    System.out.println(qry.toString());

    Query q = new QueryParser(Version.LUCENE_42, "title", analyzer).parse(qry.toString());

    int hitsPerPage = 10;
    TopScoreDocCollector collector = TopScoreDocCollector.create(
            hitsPerPage, true);

    searcher.search(q, collector);

    ScoreDoc[] hits = collector.topDocs().scoreDocs;

    for (int i = 0; i < hits.length; ++i) {
        int docId = hits[i].doc;
        Document doc = searcher.doc(docId);
        System.out.println((i + 1) + ". \t" + doc.get("title"));
    }

    reader.close();
}

private void addDoc(String title, String[] keywords) throws IOException {
    // Create new document
    Document doc = new Document();

    // Add title
    doc.add(new TextField("title", title, Field.Store.YES));

    // Add keywords
    for (int i = 0; i < keywords.length; i++) {
        doc.add(new TextField("keyword", keywords[i], Field.Store.YES));
    }

    // Add document to index
    this.writer.addDocument(doc);
}

您的问题不在于如何索引该字段。字符串字段是将整个输入索引为单个标记的正确方法。问题在于你如何搜索。我真的不知道你想用这个逻辑来完成什么,真的。

BooleanQuery qry = new BooleanQuery();
qry.add(new TermQuery(new Term("keyword", "\"Annotation is cool\"")), BooleanClause.Occur.MUST);
//Great! You have a termQuery added to the parent BooleanQuery which should find your keyword just fine!

Query q = new QueryParser(Version.LUCENE_42, "title", analyzer).parse(qry.toString());
//Now all bets are off.

Query.toString()是一种方便的调试方法,但假设通过 QueryParser 运行输出文本查询将重新生成相同的查询是不安全的。标准查询解析器实际上没有太多能力将多个单词表达为单个术语。我相信,您看到的字符串版本将如下所示:

keyword:"Annotation is cool"

这将被解释为短语查询。 PhraseQuery 将查找三个连续的术语,注解, is, and cool,但是你索引这个的方式,你有一个术语“注释很酷”.

解决方案是永远不要使用类似的逻辑

 Query nuttyQuery = queryParser.parse(perfectlyGoodQuery.toString());
 searcher.search(nuttyQuery);

相反,只需使用您已创建的 BooleanQuery 进行搜索即可。

 searcher.search(perfectlyGoodQuery);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lucene 4.2 字符串字段 的相关文章

  • Lucene 中的关键字(OR、AND)搜索

    我在我的门户 基于 J2EE 中使用 Lucene 来提供索引和搜索服务 问题出在Lucene的关键字上 当您在搜索查询中使用其中之一时 您会收到错误消息 例如 searchTerms ik OR jij 这工作正常 因为它会搜索 ik o
  • 索引的最大大小/文档数量是多少 - 32 位操作系统上的 java lucene 3.0.2

    我正在使用 lucene 和 40GB 的数据 500M 的元组 2 个字段的行为类似于键值 我创建了一个 35 GB 的索引 但它不起作用 因此 我想创建一组较小的索引 但为此 我需要有关最大尺寸的信息 你使用什么文件系统 您绝对确定已创
  • 嵌套布尔查询?

    我正在使用 BooleanQuery 来组合多个查询 我发现如果我向 BooleanQuery 添加 BooleanQuery 则不会返回任何结果 添加的 BooleanQuery 是一个 MUST NOT 查询 例如 city id 10
  • 对 SolrConfig.xml 文件的更新未得到反映

    我在 SolrConfig xml 文件中添加了一个新的请求处理程序 但是每当我尝试使用新的处理程序时 我都会收到带有 未知处理程序 错误的 404 修改SolrConfig xml文件时是否还需要修改其他文件 Thanks 您需要重新启动
  • Solr:如何动态提升有限数量的文档? QueryElevationComponent 是否需要修改?

    我的要求是提升数量有限针对用户请求的 例如五个 文档 我有的是一个文档字段它存储类似于表示增强值的数值电梯排名值 因此 用户查询将返回 5 个具有最高电梯排名值的文档 其余文档按常规顺序填充页面 怎么做 The QueryElevation
  • ElasticSearch 全文搜索

    我尝试在elasticsearch java api 中使用正则表达式运行全文搜索 我的过滤器是这样的 FilterBuilder qFilter FilterBuilders regexpFilter all text 但它只匹配一个单词
  • 将 json 请求 POST 到 Solr,请求中带有cursorMark

    是否可以包括cursorMarkPOST 请求正文中的值而不是将其作为查询字符串参数发送 以下查询 query val abc limit 10 cursorMark sort id asc 返回一条错误消息 JSON 请求中未知的顶级键
  • Lucene 上打开的文件太多错误

    我正在进行的项目是对一定数量的数据 长文本 建立索引 并将它们与每个时间间隔 大约 15 到 30 分钟 的单词列表进行比较 一段时间后 比如说第 35 轮 在开始索引第 36 轮的新数据集时 发生了此错误 ERROR 2011 06 01
  • Solr MoreLikeThis 不适用于多个分片?

    我在 SolrCloud 中有 5 个节点集群 每个节点有 2 个分片 Solr版本 6 3 0 现在 当我运行 mlt 查询时 它仅返回每个节点的结果 并且不会将它们分布在所有分片 节点上 即 没有给出任何结果 给出结果 我什至尝试将其指
  • Lucene外来字符问题

    我在使用 Zend Lucene 和 等外来字符时遇到了一些严重的问题 这些问题在创建索引和查询索引时都会出现 我已经尝试过 iso 8859 1 和 utf 8 ISO 8859 1 不起作用的查询看起来像 area sk ne 使用 Z
  • 如何添加到 OrientDB 中的空间索引?

    我正在使用工作室的 OrientDB 2 0 我使用文档中的代码成功创建了 Lucene 空间索引 CREATE class Place extends V CREATE property Place name string CREATE
  • Lucene,索引已经/外部标记化的标记并定义自己的分析过程

    在使用Lucene的过程中 我有点失望 我不明白或不明白我应该如何继续为任何 Lucene 分析器提供已经可直接索引的东西 或者我应该如何继续创建我自己的分析器 例如 如果我有一个List
  • 如何使用 lucene 查询找到空的 Solr 文档字段

    我有一些这样的文件
  • 在elasticsearch中转义特殊字符

    我正在使用Elasticsearch python 客户端 https elasticsearch py readthedocs io en master 对我们托管的 elasticsearch 实例进行一些查询 我注意到一些字符需要转义
  • Lucene 4.0 中的术语频率

    尝试使用 Lucene 4 0 计算词频 我的文档频率工作得很好 但不知道如何使用 API 来执行术语频率 这是我的代码 private static void addDoc IndexWriter writer String conten
  • Solr/Solrj 分页

    我正在创建的 Web 应用程序中使用 solr 和 solrj 来实现索引和搜索功能 我的请求处理程序在 solrconfig xml 中配置如下
  • NoSQL(MongoDB)与 Lucene(或 Solr)作为数据库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着基于文档数据库的 NoSQL 运动的发展 我最近关注了 MongoDB 我注意到如何将项目视为 文档 就像 Lucene 以及 Solr 用
  • Lucene 4.4.0新增ControlledRealTimeReopenThread示例使用

    在新的 Lucene 4 4 0 版本中 近实时管理器 org apache lucene search NRTManage 已被替换为受控实时重开线程 https issues apache org jira browse LUCENE
  • lucene 如何与 Neo4j 配合使用

    我是新来的Neo4j and Solr Lucene 我读到我们可以在 Neo4j 中使用 lucene 查询 这是如何工作的 Neo4j中使用lucene查询有什么用 我还需要一个建议 我需要编写一个应用程序来搜索和分析数据 which
  • 在云模式下设置 Apache Solr

    我必须执行以下操作 我必须在 2 个服务器 节点上部署 Solr 在另一台服务器上部署 Zookeeper 将自定义配置上传到 Zookeeper 创建具有 2 个分片和 2 个副本的自定义集合 Solr 7 4 0 和 Zookeeper

随机推荐

  • JSON 到 Java 对象,对 json 流进行建模的最佳实践

    我有一个由当前正在开发的服务器端 C 程序生成的 JSON 流 我已经获得了生成的 JSON 的示例 我担心我必须手动解析 json 我将无法使用 GSON 或 Jackson 等工具提供的普通类映射 请看一下他们提供的以下 有些 人为的示
  • 用 pandas 填充信号时保留原始数据点

    考虑以下测试数据集 testdf pandas DataFrame t datetime 2015 1 1 10 0 datetime 2015 1 1 11 32 datetime 2015 1 1 12 0 val 1 2 3 我想使用
  • JAVA使用Selenium时如何禁用Javascript?

    我正在使用 Selenium 通过 JAVA 进行网络测试 我想在 Firefox 浏览器 Google Chrome 浏览器 IE 浏览器上停止 JavaScript 我在 Firefox 浏览器上尝试了这段代码 FirefoxProfi
  • Hibernate双向@ManyToOne,更新非拥有方不起作用

    我有一个非常简单的设置来尝试带有注释的双向映射 Entity public class TypeA extends AbstractModel
  • Lua中如何转义变量

    Lua中有没有办法转义整个变量 喜欢 local blah some pattern string gsub blah 变量 blah 发生变化 并在另一个模式匹配的其他地方使用 每当 blah 中有一个魔术字符时 在其他地方完成的第二个模
  • UIButton 圆角在 iPhone 5 上无法正常工作

    这是通过 UI 扩展方法实现的 extension UIView func roundCorners corners UIRectCorner radiusWidth CGFloat radiusHeight CGFloat let pat
  • C++ 中的 Google Pub/Sub 消费者示例

    我正在尝试使用 Google Pub Sub 我需要将其集成到 C 代码库中 由于没有原生支持Google Pub Sub在 C 中 我通过使用它gRPC 因此 我生成了相应的pubsub grpc pb h pubsub grpc pb
  • Windows 文件夹共享 API

    是否有 WIN32 API 可用于管理 Windows 中的文件夹共享 一些示例链接会有所帮助 谢谢 是的 从 Windows 2000 Professional 开始 netapi32 dll 中提供了一个网络 API 它提供了此功能 N
  • 从本地 .resx 文件获取值 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 如何从 asp net 中的本地 resx 文件获取值 从代码隐藏 Cultur
  • Python:使用“yield from”时出现奇怪的行为

    在下面的代码中 我遇到了RecursionError maximum recursion depth exceeded def unpack given for i in given if hasattr i iter yield from
  • 如何通过箭头键更改突出显示的 tkinter 按钮?

    我正在使用 python 中的 tkinter 库开发键盘应用程序 我做了一个键盘 我想要的是突出显示一个键 然后单击箭头键我想更改该突出显示的键 这是我的键盘代码 from tkinter import import tkinter Ke
  • GCM HTTP 错误 401:未经授权

    我在客户端集成了 GCM 也制作了服务器端组件 一切工作正常 我能够从服务器向所有注册的客户端发送推送通知 我使用谷歌应用程序引擎作为我的服务器 问题出现时 I changed the API Key on server 早些时候 我使用我
  • 使用反射/ TypeDescriptor 设置匿名类型的属性值是否可能?

    我尝试使用 TypeDescriptor 并且该值没有改变 并且通过反射我得到一个错误 表明该属性没有设置器 C 匿名类型是不可变的 并且它们的属性无法更改 If you really如果愿意 您可以使用反射来设置支持字段 但这将是一个坏主
  • 受约束的 TypeVar 和 Union 之间有什么区别?

    如果我想要一个可以是多种可能类型的类型 Union我似乎是这样表示的 U Union int str U可以是一个int or a str 我注意到了TypeVars 允许可选的 var arg 参数 它们似乎也做同样的事情 T TypeV
  • 为什么/何时 cout 缓冲区自动刷新?

    我的理解是从here如果我要输出字符而不刷新缓冲区 endl or cin 在程序结束之前它们不会出现在我的控制台上 所以我尝试做一个无限循环 for std cout lt lt a lt lt std endl 和不刷新缓冲区相同 fo
  • rdf:resource中#的含义是什么

    我不清楚什么时候应该在 URI 之前rdf resource with 特点 它到底是什么意思 是使用相对 URI 的方式 还是必须与rdf ID但不与rdf about 您能否附上错误和正确用法的示例 inside rdf resourc
  • 如何在XAML中引用图像资源?

    我放了一个Image窗口上的控件 我想显示存储在名为 Resources resx 的项目资源文件中的图像 资源文件中图像的名称是 搜索 有人可以告诉我如何去做这件事吗 如果图像位于您的资源文件夹中并且其构建操作设置为资源 您可以在 XAM
  • PHP 正则表达式不包括
     标签                
                

    我正在使用名为的 WordPress 插件Acronyms https wordpress org plugins acronyms 该插件用其描述替换首字母缩略词 它使用 PHPPREG REPLACE功能 问题是它取代了包含在 pre
  • 在 WiX 安装程序中设置服务启动类型

    我正在尝试将预安装服务的启动类型设置为Automatic 使用 WiX 另一项任务是在安装时启动服务 我是通过以下方式实现的
  • Lucene 4.2 字符串字段

    我是 Lucene 的新手 我有两个文档 我希望与称为 关键字 的文档字段完全匹配 该字段可能在文档中出现多次 第一个文档包含关键字 Annotation is Cool 第二个文档包含关键字 注释也很酷 当我搜索 注释很酷 时 如何构建查