java - 在 Elasticsearch 中使用 ngram 进行搜索

标签 java elasticsearch

我可以在 Elasticsearch 中搜索术语 顺便说一句,我设置如下:

.startObject("filter")
    .startObject("lowercase")
         .field("type", "lowercase")
    .endObject()
.endObject()
.startObject("filter")
    .startObject("ngram")
        .field("type", "nGram")
        .field("min_gram", "3")
        .field("max_gram", "10")
    .endObject()
.endObject()

然后我试着像这样映射它。

builder.startObject().startObject(TYPE_TEST).startObject("properties");
   builder.startObject(title)
            .field("type", "string")
            .field("store", "yes")
            .field("analyzer", "series_analyzer")
            .field("boost", "10")
   .endObject();

然后我像这样在整个领域中搜索“术语”。

 curl -XGET localhost:9200/test/_search?q="testte"

我无法通过查询“某些部分术语”找到任何结果。

相反,我可以用这个查询得到好的结果

curl -XGET localhost:9200/test/_search?q=title:testte

我只想在没有“标题”字段的情况下使用 nGram 搜索术语。如何在整个领域搜索术语?

请告诉我。提前致谢

最佳答案

只有在使用 ngrams 索引的字段上进行搜索时,才能通过 ngrams 获得部分匹配项。在您的情况下,它是映射中定义的 title 字段。当您未在 query_string query 中指定字段时, 它默认使用 _all 字段,该字段使用 standard analyzer 进行索引.您可以在查询中指定不同的默认字段,这样就可以避免为每个术语指定它。如果您想将 ngram 应用于所有字段,您可以更改 _all 字段的映射,但我不建议这样做。 Ngrams 往往会大大增加索引的大小,因此我不会在所有地方应用它们。此外,通常最好对每个字段(或字段组)应用不同的文本分析,这通常是领域驱动的。

此外,_all 字段在开始和搜索所有内容时非常方便,但它是应用于所有字段的相同文本分析,您可能不想依赖它生产。从长远来看,我宁愿建议禁用它。

另一个提示:看看 match query ,这是大多数情况下使用的查询。 query_string 为您提供了更多功能,但同时也容易出错。我会使用匹配查询,除非您需要只有 query_string 提供的功能。

关于java - 在 Elasticsearch 中使用 ngram 进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17664122/

相关文章:

java - 试图找出排序的差异

java - Java中如何检查一个类是否有实例?

java - 尝试将 ArrayList 转换为 LinkedList。不知道为什么这不起作用

java - Elasticsearch : Nested Document Mapping not working

javascript - ElasticSearch client.indices.putMapping 总是失败

java - 我们如何将 Jboss Fuse 即 Servicemix ASCII 更改为自定义显示

java - JSP 中的变量没有增加

elasticsearch - 使用应用搜索来搜索诸如 “c#”之类的单词

elasticsearch - Elasticsearch中带有匹配短语前缀的“OR”过滤器

django - 为什么 Elasticsearch 在 docker 中索引少量数据时性能很差?