休眠搜索 |具有 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 分析器 的相关文章

  • 使用 lucene 改进多线程索引

    我正在尝试使用多个线程在 Lucene 中构建索引 因此 我开始编码并编写了以下代码 首先 我找到文件 并为每个文件创建一个线程来索引它 之后 我加入线程并优化索引 它有效 但我不确定 我可以大规模信任它吗 有什么办法可以改善吗 impor
  • Lucene 7+中如何通过文档ID获取DocValue?

    我正在将 DocValue 添加到文档中 doc add new BinaryDocValuesField foo new BytesRef bar 检索具有 ID 的特定文档的值docId I call DocValues getBina
  • 如何保持Lucene索引与Mysql数据库同步?

    我正在尝试利用 Lucene 在我的应用程序中开发全文搜索 这需要基于我的 mysql 数据库构建索引 我想知道如何使这些索引与数据库保持同步 我想出了办法 1 在业务逻辑中紧密地添加额外的代码来更新搜索索引 2 定期运行单独的任务来重建索
  • 如何在 Elasticsearch 中或在 Lucene 级别进行联接

    在 Elasticsearch 中执行相当于 SQL 连接的最佳方法是什么 我有一个包含两个大表的 SQL 设置 Persons 和 Items 一个人可以拥有many项目 人员和项目行都可以更改 即更新 我必须运行根据人和物品的各个方面进
  • 在 python 中快速/优化 N-gram 实现

    python 中哪种 ngram 实现速度最快 我试图分析 nltk 与 scott 的 zip http locallyoptimal com blog 2013 01 20 elegant n gram Generation in py
  • 如何使用Lucene实现拼音搜索?

    我想使用 Lucene 6 1 0 Soundex 或任何适合葡萄牙语的算法来实现语音搜索 我在互联网上发现了许多不完整的示例 教如何实现自定义分词器 分析器 但似乎这些示例上使用的抽象类在 6 1 0 版本中并不相同 谁能指出我在哪里可以
  • Apache Solr 6.6 替换文档而不是更新

    我已配置 solr 6 6 1 进行测试设置 在索引了一些文档后 我必须更新一些字段 我正在使用 python 客户端solr https pythonhosted org solrpy reference html 要更新 以下是我的代码
  • Lucene中SpanQuery的用途是什么?

    有人可以解释一下什么是SpanQuery是 它的典型用例是什么 The 文档 https lucene apache org core 7 7 3 core org apache lucene search spans SpanQuery
  • 在哪里可以找到 Apache Lucene/Solr 的性能基准

    是否有任何针对大型数据集上 Lucene Solr 性能基准的链接 资源 500GB 5TB以上范围的数据集 Thanks Lucene 提交者 Mike McCandless 运行基准 http people apache org mik
  • Lucene 中跨多个字段的重复值的影响

    在 lucene 索引中的多个字段中重新索引相同的值会产生什么影响 这个想法是 某人的名字是他们的名字和一般详细信息的一部分 所以我想将该值索引到多个字段中 Ted Bloggs 我可能会索引如下 Field Value firstName
  • Elasticsearch 6.2 / Kibana查询:一字段必须存在,一字段不能存在

    我的愿望是搜索 field 存在且 fields b 不存在的文档 有没有办法使用 Kibana 中的 Lucene 查询语法 Kibana 的 发现 部分中的 搜索 字段 来执行此操作 我尝试过使用 缺失 字段 b没有成功 exists
  • Lucene索引:查询时得到空结果

    我正在尝试使用 Lucene 索引进行查询 但在日志中得到空结果和以下错误 Traversal query query without index select jcr path from nt base where isdescendan
  • lucene:如何添加不重复的文档

    就我而言 插入 lucene 索引的每个文档都有其唯一的 ID 当向lucene索引添加新文档时 如果该文档已经存在于索引中 则不应将该文档插入到索引中 如何实施这一战略 我想我应该先用docId搜索文档 如果lucene找不到该文档 那么
  • Lucene 的 StopFilter 中使用的默认停用词列表是什么?

    Lucene 有一个默认的 stopfilter http lucene apache org core 4 0 0 analyzers common org apache lucene analysis core StopFilter h
  • Solr 中的多值字段排序

    我有一个 Solr 索引 将每个产品的价格存储在多值字段中 我需要按价格对结果集进行排序 其中价格从低到高 从高到低 我尝试对价格进行排序 它显示错误您无法对 multivalued True 字段进行排序 下面是我的 solr XML
  • 在具有多个 Web 服务器的现有 .NET / SQL Server 堆栈上实施 Lucene

    我想考虑使用 Lucene 为我当前管理的网站提供全文搜索解决方案 该网站完全基于 SQL Server 2008 C NET 4 技术构建 我要索引的数据实际上非常简单 每个记录只有几个字段 并且只有其中一个字段实际上是可搜索的 我不清楚
  • 需要在 java api 中的 Solr 搜索中搜索文本及其周围的几行

    我正在使用 solr 7 7 2 并且我使用 solrj 在 Solr 中编写了一个 Java 程序 该程序在一个巨大的文本文件中搜索单词 我使用以下代码来显示代表整个文本的搜索结果 SolrQuery params new SolrQue
  • openNLP 与 Solr 集成时出现异常

    我正在尝试将 openNLP 与 Solr 6 1 0 集成 我配置了架构和 solrconfig 文件 详细信息请参见 wiki 链接 https wiki apache org solr OpenNLP https wiki apach
  • 我们可以同时使用拼音标记和同义词吗?

    我正在尝试同时启用语音分析器和同义词 这似乎不起作用 它们一起使用有错吗 在下面的实现中 我希望使用同义词转换搜索查询 然后使用语音分析器来检索结果 但我的同义词在这里完全被忽略了 如果我在创建索引时删除语音分析器 那么同义词就可以正常工作
  • Lucene,索引已经/外部标记化的标记并定义自己的分析过程

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

随机推荐

  • 使用 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 的值 我希望能够通过仅搜索一个字符来找到一个实体 因为医院有可能只有单个字符名称