所以我有这个索引
{
"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.4
上localhost
。
以您的示例为基础,让我们添加显式映射。注意我为该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"
}'
现在我们可以运行查询了。
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" ]
}
这次code
和code.ngem
字段均正确突出显示。但是当使用更长的查询时,情况会迅速改变:
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”字段):