用于索引和搜索的 Lucene 分析器

2024-03-11

我有一个正在使用 Lucene 建立索引的字段,如下所示:

@Field(name="hungerState", index=Index.TOKENIZED, store=Store.YES)
public HungerState getHungerState() {

该字段的可能值为HUNGRY, SLIGHTLY_HUNGRY, and NOT_HUNGRY

当这些值使用索引时StandardAnalyzer,这些项最终为hungry, slightly因为它对标点符号进行标记并忽略“不”。

如果我将索引更改为index=Index.UN_TOKENIZED,索引项是HUNGRY, SLIGHTLY_HUNGRY, and NOT_HUNGRY,正如预期的那样。

我的搜索 API 有 1 个“搜索”方法,用于构造Query像这样:

MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, getSearchFields(), new StandardAnalyzer(Version.LUCENE_30));
parser.setDefaultOperater(QueryParser.AND_OPERATOR);
Query query = parser.parse(searchTerms);

这处理 searchTerms = "foo" 的搜索,它搜索由getSearchFields()在“foo”上,以及 searchTerms 指定要搜索的字段和值的位置(即“hungerState:HUNGRY”)

我的问题是后一种情况。由于查询解析器使用 StandardAnalyzer,因此搜索hungerState:SLIGHTLY_HUNGRY被解析为hungerState:"slightly hungry"并搜索hungerState=NOT_HUNGRY被解析为hungerState=hungry.

当使用 StandardAnalyzer 对该字段进行索引时,我得到了意外的结果(搜索 HUNGRY 和 NOT_HUNGRY 返回所有 3 个值的结果)。当字段索引为 UN_TOKENIZED 时,我不会得到任何结果,因为查询解析器对搜索字符串进行标记并使其小写。

我什至尝试指定一个分析器来进行索引,例如KeywordAnalyzer,但它几乎没有任何效果,因为整个搜索字符串都是用StandardAnalyzer每次。

任何意见,将不胜感激。谢谢!


您正在为查询解析器使用标准分析器,因此您的查询将使用标准分析器进行分析。只需切换到使用关键字分析器:

MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, getSearchFields(), 
          new KeywordAnalyzer(Version.LUCENE_30));

您可能想使用每个字段分析器包装器 http://lucene.apache.org/java/3_0_1/api/all/org/apache/lucene/analysis/PerFieldAnalyzerWrapper.html如果您的其他字段不是关键字。

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

用于索引和搜索的 Lucene 分析器 的相关文章

  • 无法解析类型为 xxx 的任何 bean;限定符:[@javax.enterprise.inject.Any()]

    我有一个 LoginProvider 接口 public interface LoginProvider boolean login String username String password 以及两种不同的实现 public clas
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • JPA 支持查询 Postgres JSON 字段

    JPA 是否已经支持处理 JSON 字段的查询 如下所示 select from person where info gt gt age numeric 40 select from person where info gt gt firs
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • JPA 中所有命名查询的列表

    我想获取应用程序中所有 NamedQueries 的列表 并且我还想在运行时一般调用它们 是否有一个选项可以获取列表以及某种元数据 一般来说是某种反射 另一个线程为 NHibernate 提供了某种解决方案 即使使用 Hibernate 作
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • hibernate sessionfactory如何管理session?

    我刚刚得到了Hibernate Session和Connection之间的关系 但现在 我又遇到了一个问题 hibernate sessionfactory如何管理session 在以下代码段中 DAO 类的 save 方法 Session
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop

随机推荐