休眠搜索 |具有 minGramSize 1 的 ngram 分析器

2024-02-03

我的 Hibernate Search 分析器配置存在一些问题。 我的索引实体之一(“Hospital”)有一个字符串字段(“name”),其中可能包含长度为 1-40 的值。我希望能够通过仅搜索一个字符来找到一个实体(因为医院有可能只有单个字符名称)。

@Indexed(index = "HospitalIndex")
@AnalyzerDef(name = "ngram",
        tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
        filters = {
                @TokenFilterDef(factory = StandardFilterFactory.class),
                @TokenFilterDef(factory = LowerCaseFilterFactory.class),
                @TokenFilterDef(factory = NGramFilterFactory.class,
                        params = {
                                @Parameter(name = "minGramSize", value = "1"),
                                @Parameter(name = "maxGramSize", value = "40")})
        })
public class Hospital {

        @Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO, analyzer = @Analyzer(definition = "ngram"))
        private String name = "";
}

如果我添加一家名为“My Test Hospital”的医院,Lucene 索引将如下所示:

1   name    al
1   name    e
1   name    es
1   name    est
1   name    h
1   name    ho
1   name    hos
1   name    hosp
1   name    hospi
1   name    hospit
1   name    hospita
1   name    hospital
1   name    i
1   name    it
1   name    ita
1   name    ital
1   name    l
1   name    m
1   name    my
1   name    o
1   name    os
1   name    osp
1   name    ospi
1   name    ospit
1   name    ospita
1   name    ospital
1   name    p
1   name    pi
1   name    pit
1   name    pita
1   name    pital
1   name    s
1   name    sp
1   name    spi
1   name    spit
1   name    spita
1   name    spital
1   name    st
1   name    t
1   name    ta
1   name    tal
1   name    te
1   name    tes
1   name    test
1   name    y
1   name    a

这就是我构建和执行搜索查询的方式:

QueryBuilder hospitalQb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Hospital.class).get();
Query hospitalQuery = hospitalQb.keyword().onFields("name")().matching(searchString).createQuery();
javax.persistence.Query persistenceQuery = fullTextEntityManager.createFullTextQuery(hospitalQuery, Hospital.class);
List<Hospital> results = persistenceQuery.getResultList();  

问题是相同的 ngram 分析器也用于我的搜索查询。因此,当我搜索“医院”时,我会找到名称中包含“a”字符的所有医院。 当我对其调用 toString 方法时,搜索查询如下所示:

name:h name:ho name:hos name:hosp name:hospi name:hospit name:hospita name:hospital name:o name:os name:osp name:ospi name:ospit name:ospita name:ospital name:s name:sp name:spi name:spit name:spita name:spital name:p name:pi name:pit name:pita name:pital name:i name:it name:ita name:ital name:t name:ta name:tal name:a name:al name:l

所以问题是,是否有人知道更好的分析器配置或另一种构建解决问题的搜索查询的方法?


Hibernate Search 6 的更新答案

使用 Hibernate Search 6,您可以定义第二个分析器,与您的“ngram”分析器相同,只是它没有 ngram 过滤器,并将其指定为searchAnalyzer https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#mapper-orm-directfieldmapping-search-analyzer对于您的领域:

public class Hospital {
        // ...

        @FullTextField(analyzer = "ngram",
                searchAnalyzer = "my_analyzer_without_ngrams")
        private String name = "";

        // ...
}

然后 Hibernate Search 在索引时会自动使用“ngram”分析器,但在搜索时会自动使用“my_analyzer_without_ngrams”,这将导致预期的行为。

此外,如果您正在实施某种自动完成功能(foo*),而不是词内搜索 (*foo*),你可能想使用EdgeNGramFilterFactory代替NGramFilterFactory:它只会生成作为索引标记前缀的 ngram。


Hibernate Search 5 的原始答案

您可以设置第二个分析器,与“ngram”分析器相同,只是它没有 ngram 过滤器,然后覆盖用于查询的分析器:

QueryBuilder hospitalQb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Hospital.class)
    .overridesForField( "name", "my_analyzer_without_ngrams" )
    .get();
// Then it's business as usual

此外,如果您正在实施某种自动完成功能(foo*),而不是词内搜索 (*foo*),你可能想使用EdgeNGramFilterFactory代替NGramFilterFactory:它只会生成作为索引标记前缀的 ngram。

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

休眠搜索 |具有 minGramSize 1 的 ngram 分析器 的相关文章

  • 将 json 请求 POST 到 Solr,请求中带有cursorMark

    是否可以包括cursorMarkPOST 请求正文中的值而不是将其作为查询字符串参数发送 以下查询 query val abc limit 10 cursorMark sort id asc 返回一条错误消息 JSON 请求中未知的顶级键
  • 每个领域都有不同的分析仪

    如何为使用 Lucene 索引的文档中的每个字段启用不同的分析器 例子 RAMDirectory dir new RAMDirectory IndexWriter iw new IndexWriter dir new StandardAna
  • Azure 搜索 .NET SDK 自定义分析器

    没有太多背景 这是我的问题 要使用 C 中的 NET SDK 创建新的 Azure 搜索索引 使用文档中提供的酒店示例 我的代码如下所示 public class Hotel System ComponentModel DataAnnota
  • 用于估计(一元)困惑度的 NLTK 包

    我正在尝试计算我所拥有的数据的困惑度 我正在使用的代码是 import sys sys path append usr local anaconda lib python2 7 site packages nltk from nltk co
  • Solr MoreLikeThis 不适用于多个分片?

    我在 SolrCloud 中有 5 个节点集群 每个节点有 2 个分片 Solr版本 6 3 0 现在 当我运行 mlt 查询时 它仅返回每个节点的结果 并且不会将它们分布在所有分片 节点上 即 没有给出任何结果 给出结果 我什至尝试将其指
  • 需要在 java api 中的 Solr 搜索中搜索文本及其周围的几行

    我正在使用 solr 7 7 2 并且我使用 solrj 在 Solr 中编写了一个 Java 程序 该程序在一个巨大的文本文件中搜索单词 我使用以下代码来显示代表整个文本的搜索结果 SolrQuery params new SolrQue
  • Solr 过滤查询 - 字符串与整数

    假设我正在尝试查询一堆具有类别的文档 并且我想将查询限制为指定的类别 据我所知 这只是使用 fq 参数 过滤器查询 我想知道将参数设置为整 数而不是字符串或数据通常的情况是否会提高性能 我只是会在右侧犯错 但我想我应该仔细检查一下 以防万一
  • Lucene,索引已经/外部标记化的标记并定义自己的分析过程

    在使用Lucene的过程中 我有点失望 我不明白或不明白我应该如何继续为任何 Lucene 分析器提供已经可直接索引的东西 或者我应该如何继续创建我自己的分析器 例如 如果我有一个List
  • Solr:在带有空格的字符串上使用通配符

    我的问题与这里讨论的问题基本相同 带空格的 Solr 通配符查询 https stackoverflow com questions 10023133 solr wildcard query with whitespace 但这个问题没有得
  • MultiFieldQueryParser 正在从首字母缩略词中删除点

    我再次发布这个问题 因为我的查询没有得到答复 我正在使用 Lucene 开发图书搜索 api 用户可以搜索标题或描述字段包含 C F A 的书籍 我正在使用 StandardAnalyzer 以及停用词列表 我使用 MultiFieldQu
  • 如何运行和理解CUDA Visual Profiler?

    我已经设置了 CUDA 5 0 并且我的 CUDA 项目运行良好 但我不知道如何使用 Visual Profiler 分析我的 CUDA 项目 如何运行它 我还需要安装更多吗 又该如何做呢 我的电脑使用Window 7 64位 CUDA 5
  • Solr/Solrj 分页

    我正在创建的 Web 应用程序中使用 solr 和 solrj 来实现索引和搜索功能 我的请求处理程序在 solrconfig xml 中配置如下
  • Lucene 标准分析器与 Snowball

    刚刚开始使用 Lucene Net 我使用标准分析器索引了 100 000 行 运行了一些测试查询 并注意到如果原始术语是单数 则复数查询不会返回结果 我知道雪球分析器增加了词干支持 这听起来不错 不过 我想知道 超过标准的雪球锣是否有任何
  • 如何在scala中生成n-gram?

    我正在尝试在 scala 中编写基于 n gram 的分离新闻算法 如何为大文件生成 n gram 例如 对于包含 蜜蜂是蜜蜂中的蜜蜂 的文件 首先它必须选择一个随机的 n 元语法 例如 蜜蜂 然后它必须寻找以 n 1 个单词开头的 n 元
  • lucene 如何与 Neo4j 配合使用

    我是新来的Neo4j and Solr Lucene 我读到我们可以在 Neo4j 中使用 lucene 查询 这是如何工作的 Neo4j中使用lucene查询有什么用 我还需要一个建议 我需要编写一个应用程序来搜索和分析数据 which
  • 如何删除 Hibernate Search 中的所有重复结果?

    我正在使用 Infinispan 6 0 2 和 Hibernate Search 4 4 0 一开始 在我执行类似的查询之后 CacheQuery cq SearchManager getQuery query Hibernate cla
  • 如何分析堆转储

    我成功地生成了我的应用程序机器的堆转储 但我不知道如何分析它 有人可以告诉我怎么做吗 在 Sun Solaris 上使用适用于 Java 的 jhat 实用程序 一个很好的例子在这里https blogs oracle com alanb
  • 为文件中的每个单词创建字典并计算其后面的单词的频率

    我正在尝试解决一个难题 却迷失了方向 这就是我应该做的 INPUT file OUTPUT dictionary Return a dictionary whose keys are all the words in the file br
  • 特定查询出现错误

    Lucene 的新手 我在 java 客户端中将它与 Hibernate 一起使用 并且在特定查询上收到此错误 HSEARCH000146 The query string a applied on field name has no me
  • 如何增强solr中的字段

    我已经事先确定了提升 我在 solr 索引中有一个名为boost1 该提升字段的值介于 1 到 10 之间 类似于 google PR 排名 这是应该应用于 solr 中运行的每个查询的提升 这是我的索引中的字段 Id Title Text

随机推荐

  • 使用 Spark DataFrame 获取列上的不同值

    使用 Spark 1 6 1 版本 我需要获取列上的不同值 然后在其之上执行一些特定的转换 该列包含超过 5000 万条记录 并且可以增长得更大 我明白做一个distinct collect 会将调用带回驱动程序 目前我正在执行以下任务 有
  • Google Analytics with jQuery - 在标签中显示路径名

    我已经创建了跟踪 效果很好 如下所示 a external click function gaq push trackEvent Exit Links Click this attr href a href http example com
  • web.config 位置路径属性上的正则表达式(带参数)

    有没有办法做这样的事情
  • 如何在 MySQL 的 CONCAT 中使用 GROUP_CONCAT

    如果我在 MySQL 中有一个包含以下数据的表 id Name Value 1 A 4 1 A 5 1 B 8 2 C 9 如何将其转换为以下格式 id Column 1 A 4 5 B 8 2 C 9 我想我必须使用GROUP CONCA
  • javascript内部如何表示大于Number.MAX_SAFE_INTEGER的整数? [复制]

    这个问题在这里已经有答案了 在 JavaScript 中 数字在内部表示为双精度浮点数 这意味着有 53 位可用于表示整数值 有一个Number MAX SAFE INTEGER说明这一点的常数 等于Math pow 2 53 1 但是 在
  • Objective C - 错误:“需要类型”

    我在一些我认为很简单的事情上遇到了一个非常奇怪的错误 import
  • 通过 LDAP 进行 Kerberos 身份验证

    我正在开发控制台应用程序 它使用 ldap DirectoryServices Protocols 从活动目录中获取用户数据 目前 我可以使用 SSL TLS 和简单连接 既不是 SSL 也不是 TLS 的基本身份验证来获取数据 但现在我想
  • 如何将 ViewModel 中的数据发送到控制器方法中?

    我正在尝试将 JavaScript 函数中的数据发送到控制器方法中 当我有一个简单的模型时它工作正常 但是当我在使用包含多个对象的 ViewModel 时尝试发布数据时它不起作用 换句话说 我有一个登录页面 并且从我的角度来看 我将数据发布
  • Android 进度条不显示

    private Handler handler new Handler Override public void handleMessage Message msg removeDialog 0 switch msg what case S
  • 如何在自动热键中将字符串转换为数字?

    FormatTime CurrentMinute m将当前分钟分配给变量 CurrentMinute 其值是字符串 而不是数字 我想做一些计算 CurrentMinute 那么如何将其转换为数字呢 感谢您提前提供任何帮助 AutoHotke
  • 有没有办法在 matplotlib 中制作多个水平箱线图?

    我正在尝试制作一个 matplotlib 图 该图将多个水平箱线图彼此堆叠 该文档展示了如何制作单个水平箱线图以及如何制作多个垂直方向的图在这个部分 http matplotlib sourceforge net api pyplot ap
  • 无法访问刚刚创建的文件[重复]

    这个问题在这里已经有答案了 我的程序包含一个窗体和七个用户控件 我正在使用 MS Visual Studio 2010 C 语言 我的计划 将 txt 文件中的所有文本显示到 UserControl 中的文本框中 My Aim 我想检查 t
  • Crashlytics 与 proguard 崩溃

    我做了 Fabric 在他们的文档中要求的一切 renamesourcefileattribute SourceFile keepattributes Annotation keepattributes SourceFile LineNum
  • 在 Webview 中运行 javascript 代码

    我有一个在 android 中使用的 webview 我试图在单击按钮时触发 javascript 我正在尝试使用下面的代码将类的颜色更改为红色 但我似乎无法让它发挥作用 final WebView wb WebView findViewB
  • 找不到 com.sun.xml.rpc.tools.ant.Wscompile

    我需要使用以下服务 http mihansmscenter com webservice wsdl http mihansmscenter com webservice wsdl所以我应该使用 jax rpc 然后我将 jax rpc 插件
  • 凌乱的散点图回归线:Python

    在python 2 7 6 matlablib scikit learn 0 17 0中 当我在散点图上制作多项式回归线时 多项式曲线将非常混乱 如下所示 脚本是这样的 它将读取两列浮动数据并绘制散点图和回归 import pandas a
  • 在 Sublime text 中显示 Python 输出 [重复]

    这个问题在这里已经有答案了 Python 和 Sublime 新手 问题 我输入 print 你好世界 如何让它向我显示输出 Hello world 它是在单独的窗口中吗 或者 我知道我可以使用内置的 Python 控制台 但那是一个命令行
  • AutoMapper 从静态 API 迁移

    https github com AutoMapper AutoMapper wiki Migration from static API https github com AutoMapper AutoMapper wiki Migrat
  • 当随机字段值改变时,Solr 会更改文档的分数

    我需要在按分数排序的 Solr 结果集中来回导航 一一查看文档 为了形象化这一点 首先向用户呈现文档标题列表 然后他或她可以单击其中一个标题以查看更多详细信息 然后需要有机会移至原始列表中的下一个文档 而无需返回和查看单击另一个标题 在查看
  • 休眠搜索 |具有 minGramSize 1 的 ngram 分析器

    我的 Hibernate Search 分析器配置存在一些问题 我的索引实体之一 Hospital 有一个字符串字段 name 其中可能包含长度为 1 40 的值 我希望能够通过仅搜索一个字符来找到一个实体 因为医院有可能只有单个字符名称