当前位置: 首页 > 面试题库 >

如果将min_gram设置为1,则在ngram过滤器上突出显示Elasticsearch是很奇怪的

暴乐邦
2023-03-14
问题内容

所以我有这个索引

{
  "settings":{
    "index":{
      "number_of_replicas":0,
      "analysis":{
        "analyzer":{
          "default":{
            "type":"custom",
            "tokenizer":"keyword",
            "filter":[
              "lowercase",
              "my_ngram"
            ]
          }
        },
        "filter":{
          "my_ngram":{
            "type":"nGram",
            "min_gram":2,
            "max_gram":20
          }
        }
      }
    }
  }
}

我正在通过轮胎宝石进行搜索

{
   "query":{
      "query_string":{
         "query":"xyz",
         "default_operator":"AND"
      }
   },
   "sort":[
      {
         "count":"desc"
      }
   ],
   "filter":{
      "term":{
         "active":true,
         "_type":null
      }
   },
   "highlight":{
      "fields":{
         "name":{

         }
      },
      "pre_tags":[
         "<strong>"
      ],
      "post_tags":[
         "</strong>"
      ]
   }
}

并且我有两个应该匹配的帖子,分别名为“ xyz post”和“ xyz问题”。执行此搜索时,我正确地获得了突出显示的字段

<strong>xyz</strong> question
<strong>xyz</strong> post

现在这就是事情……一旦我在索引和重新索引中将min_gram更改为1。突出显示的字段开始像这样返回

<strong>x</strong><strong>y</strong><strong>z</strong> pos<strong>xyz</strong>t
<strong>x</strong><strong>y</strong><strong>z</strong> questio<strong>xyz</strong>n

我根本不明白为什么。


问题答案:

简短答案

您需要检查 映射 并查看是否使用fast-vector-highlighter。但是,您仍然需要非常小心自己的查询。

详细答案

假设使用ES的新实例0.20.4localhost

以您的示例为基础,让我们添加显式映射。注意我为该code字段设置了两种不同的分析。唯一的区别是"term_vector":"with_positions_offsets"

curl -X PUT localhost:9200/myindex -d '
{
  "settings" : {
    "index":{
      "number_of_replicas":0,
      "number_of_shards":1,
      "analysis":{
        "analyzer":{
          "default":{
            "type":"custom",
            "tokenizer":"keyword",
            "filter":[
              "lowercase",
              "my_ngram"
            ]
          }
        },
        "filter":{
          "my_ngram":{
            "type":"nGram",
            "min_gram":1,
            "max_gram":20
          }
        }
      }
    }
  },
  "mappings" : {
    "product" : {
      "properties" : {
        "code" : {
          "type" : "multi_field",
          "fields" : {
            "code" : {
              "type" : "string",
              "analyzer" : "default",
              "store" : "yes"
            },
            "code.ngram" : {
              "type" : "string",
              "analyzer" : "default",
              "store" : "yes",
              "term_vector":"with_positions_offsets"
            }
          }
        }
      }
    }
  }
}'

索引一些数据。

curl -X POST 'localhost:9200/myindex/product' -d '{
  "code" : "Samsung Galaxy i7500"
}'

curl -X POST 'localhost:9200/myindex/product' -d '{
  "code" : "Samsung Galaxy 5 Europa"
}'

curl -X POST 'localhost:9200/myindex/product' -d '{
  "code" : "Samsung Galaxy Mini"
}'

现在我们可以运行查询了。

1)搜索“ i”以查看带有突出显示的字符搜索功能

curl -X GET 'localhost:9200/myindex/product/_search?pretty' -d '{
  "fields" : [ "code" ],
  "query" : {
    "term" : {
      "code" : "i"
    }
  },
  "highlight" : {
    "number_of_fragments" : 0,
    "fields" : {
      "code":{},
      "code.ngram":{}
    }
  }
}'

这将产生两个搜索结果:

# 1
...
"fields" : {
  "code" : "Samsung Galaxy Mini"
},
"highlight" : {
  "code.ngram" : [ "Samsung Galaxy M<em>i</em>n<em>i</em>" ],
  "code" : [ "Samsung Galaxy M<em>i</em>n<em>i</em>" ]
}
# 2
...
"fields" : {
  "code" : "Samsung Galaxy i7500"
},
"highlight" : {
  "code.ngram" : [ "Samsung Galaxy <em>i</em>7500" ],
  "code" : [ "Samsung Galaxy <em>i</em>7500" ]
}

这次codecode.ngem字段均正确突出显示。但是当使用更长的查询时,情况会迅速改变:

2)搜索“ ym”

curl -X GET 'localhost:9200/myindex/product/_search?pretty' -d '{
  "fields" : [ "code" ],
  "query" : {
    "term" : {
      "code" : "y m"
    }
  },
  "highlight" : {
    "number_of_fragments" : 0,
    "fields" : {
      "code":{},
      "code.ngram":{}
    }
  }
}'

这样产生:

"fields" : {
  "code" : "Samsung Galaxy Mini"
},
"highlight" : {
  "code.ngram" : [ "Samsung Galax<em>y M</em>ini" ],
  "code" : [ "Samsung Galaxy Min<em>y M</em>i" ]
}

code领域是不正确高亮(类似你的情况)。

重要的一点是, 使用查询 一词代替了 query_string



 类似资料:
  • 问题内容: 我像电话教程一样在angularJS中使用ng- repeat和filter,但我想在页面中突出显示搜索结果。使用基本的jQuery,我只需在输入的键上解析页面,但是我试图以有角度的方式进行操作。有任何想法吗 ? 我的代码: 问题答案: 对于AngularJS v1.2 + HTML: JS: CSS:

  • 问题内容: TL; DR:我不了解突出显示的工作方式,更确切地说是如何影响突出显示的。 在新的ES安装(1.4.2)上,我正在使用以下设置创建索引: 然后,我插入以下文档: 最后,我要查询“ layer-syrup”并突出显示结果,并使用不同的N()值: 一些结果: N = 15: N = 16 N = 17: N = 18: N = 19: N值更大 N = 70: N = 71: N = 72

  • 我有一对着色器程序,如果我的DataTextures是正方形(1:1),那么一切都很好,但是如果其中一个或两个都是2:1(宽度:高度)的比例,那么行为就会变得混乱。我可以使用未使用的填充来扩展每个缓冲区,以确保它们始终是方形的,但从长远来看,这似乎是不必要的昂贵(内存方面的),因为两个缓冲区中的一个在启动时非常大。在这种情况下,有没有办法处理2:1的缓冲区? 我有两个着色器程序: 第一个是单个fr

  • 在 Angular 4 中,我正在尝试迭代一个程序数组。并且还添加了搜索管道。如果未找到搜索,我想显示一条消息。 我该如何处理这个问题? 这是 ngFor 我知道我不能同时使用ngIf和ngFor。有什么方法可以让我使用ngIfElse吗?如果没有找到搜索,则显示一条消息?

  • 问题内容: 我正在尝试使用新文本更新JLabel,并且我需要此文本具有制表符空格。 这是我的代码: 标签已更新,但末尾没有制表符空间,我不知道为什么。据我所知是添加标签空间的方法。 问题答案: 不会以任何特殊方式渲染(即,在渲染之前不会将转换为空格)。 相反,您应该使用类似 在将其粘贴到标签上之前。

  • 在我的ElasticSearch数据集中,我们有用句点分隔的唯一ID。样本编号可能类似于C.123.5432 这就是我将其复制到的字段(它也有ngram分析器): 从某种意义上说,这是我用来查看搜索是否有效的命令(请注意它正在搜索“meta_data”字段):