Search APIs之Request Body Search(2)

Highlighting

荧光笔使您能够从搜索结果中的一个或多个字段突出显示片段,以便向用户显示查询匹配的位置。当您请求突出显示时,响应为每个搜索命中包含一个额外的突出显示元素,其中包括突出显示的字段和突出显示的片段。

注意:在提取要高亮显示的terms时,荧光笔不会反映查询的布尔逻辑。因此,对于一些复杂的布尔查询(e。g嵌套布尔查询,使用minimum_should_match等查询),可能会高亮显示与查询匹配不对应的部分文档。

高亮显示需要字段的实际内容。如果没有存储字段(映射没有将store设置为true),则加载实际的_source并从_source中提取相关字段。

例如,要使用默认的高亮显示器在每次搜索命中中为内容字段获取高亮显示,请在请求体中包含一个高亮对象,该对象指定内容字段:

GET /_search
{
    "query" : {
        "match": { "content": "kimchy" }
    },
    "highlight" : {
        "fields" : {
            "content" : {}
        }
    }
}

Elasticsearch支持三种荧光笔:统一、普通和fvh(快速矢量荧光笔)。可以为每个字段指定要使用的高亮类型。

Unified highlighter

统一荧光笔使用Lucene统一荧光笔。这个荧光笔将文本分解成句子,并使用BM25算法对单个句子进行评分,就好像它们是语料库中的文档一样。它还支持精确的短语和multi-term (模糊,前缀,正则表达式)突出显示。这是默认的荧光笔。

Plain highlighter

普通荧光笔使用标准的Lucene荧光笔。它试图从理解词的重要性和短语查询中的任何词定位标准方面反映查询匹配逻辑。

普通荧光笔最适合突出显示单个字段中的简单查询匹配。为了准确地反映查询逻辑,它在内存中创建一个很小的索引,并通过Lucene的查询执行规划器重新运行原始查询条件,以访问当前文档的低级匹配信息。对于需要突出显示的每个字段和每个文档,都要重复此操作。如果您想在许多具有复杂查询的文档中突出显示许多字段,我们建议使用统一的荧光笔在 posts或term_vector字段上。

Fast vector highlighter

fvh荧光笔使用Lucene快速矢量荧光笔。此高亮显示符可用于在映射中,将字段term_vector设置为with_positions_offsets。快速矢量高光:

  1. 可以使用boundary_scanner(边界扫描器)定义。
  2. 需要将term_vector设置为with_positions_offsets,这会增加索引的大小
  3. 可以将多个字段的匹配组合成一个结果。See matched_fields
  4. 可以在不同的位置为匹配分配不同的权重,允许在突出显示提升phrase matches超过term matches的提升查询时,将phrase matches在term matches之上进行排序

警告

fvh荧光笔不支持跨距查询。如果您需要对跨距查询的支持,请尝试另一种荧光笔,例如统一荧光笔。

Offsets Strategy

要从查询的术语创建有意义的搜索片段,荧光笔需要知道原始文本中每个单词的开始和结束字符偏移量。这些偏移量可由:

帖子列表。如果将映射中的index_options设置为offsets,则unified荧光笔将使用此信息突出显示文档,而无需重新分析文本。它直接在发布上重新运行原始查询,并从索引中提取匹配的偏移量,将集合限制为突出显示的文档。如果字段很大,这一点很重要,因为它不需要重新分析要突出显示的文本。与使用term_vector相比,它还占用更少的磁盘空间。

terms vector。如果通过在映射中将term_vector设置为with_positions_offsets来提供term_vector信息,则unified荧光笔将自动使用term_vector突出显示字段。特别是对于大字段(> 1MB)和突出显示前缀或通配符等multi-term查询,它的速度更快,因为它可以访问每个文档的terms字典。fvh荧光笔总是使用terms vector。

普通的高亮显示。unified当没有其他替代方案时,使用此模式。它创建一个很小的内存索引,并通过Lucene的查询执行规划器重新运行原始查询条件,以访问当前文档的低级匹配信息。对于需要高亮显示的每个字段和每个文档都要重复此操作。普通荧光笔总是使用普通高亮。

警告

对于大型文本,纯高亮显示可能需要大量的时间和内存。为了防止出现这种情况,将分析的文本字符的最大数量限制为1000000。可以通过索引设置index.highlight.max_analyzed_offset为特定索引更改此默认限制。
Highlighting Settings

可以在全局级别设置突出显示设置,并在字段级别重写突出显示设置。

boundary_chars

包含每个边界字符的字符串。默认为.,!? \t\n。

boundary_max_scan

扫描边界字符的距离。默认为20。

boundary_scanner

指定如何分割突出显示的片段: chars, sentence,或word。只适用于unified和fvh荧光笔。sentence默认为unified荧光笔。fvh荧光笔默认为char。

        1.Chars

使用delimy_chars指定的字符突出显示边界。delimy_max_scan设置控制扫描边界字符的距离。只适用于fvh荧光笔。

       2.sentence

根据Java的BreakIterator确定,在下一个句子边界处中断突出显示的片段。您可以指定要与bordery_scanner_locale一起使用的区域设置。

请注意

当与unified荧光笔一起使用时,sentence扫描器会在fragment_size旁边的第一个单词边界处分割大于fragment_size的句子。您可以将fragment_size设置为0,以从不分割任何句子。

       3.Word

根据Java的BreakIterator确定,在下一个单词边界处中断突出显示的片段。您可以指定要与bordery_scanner_locale一起使用的区域设置。

boundary_scanner_locale

控制用于搜索句子和单词边界的区域设置。该参数采用语言标记的形式,例如。“en - us”、“- fr”、“ja-JP”。更多信息可以在Locale语言标记文档中找到。默认值是local . root。

编码器

指示代码段应该是HTML编码的:默认(无编码)还是HTML (HTML-转义代码段文本,然后插入高亮标记)

字段

指定要检索突出显示的字段。可以使用通配符指定字段。例如,您可以指定comment_*来为以comment_开头的所有文本和关键字字段获取高亮显示。

请注意

使用通配符时,只突出显示文本和关键字字段。如果使用自定义映射器并希望突出显示某个字段,则必须显式指定该字段名称。

force_source

根据源高亮显示,即使字段是单独存储的。默认值为false。

Fragmenter(片段)

指定文本应如何在高亮显示段中分割:simple或span。只适用于普通荧光笔。默认为跨度。

        1.简单的

将文本分割成相同大小的片段。

       2.跨度

将文本分割为大小相同的片段,但尽量避免在突出显示的terms之间分割文本。这在查询短语时非常有用。默认。

fragment_offset

控制要开始突出显示的空白。只有在使用fvh荧光笔时才有效。

fragment_size

以字符为单位突出显示的片段的大小。默认为100。

highlight_query

突出显示搜索查询以外的查询的匹配项。如果使用rescore查询,这尤其有用,因为默认情况下高亮显示不会考虑这些查询。

重要的

Elasticsearch不验证highlight_query以任何方式包含搜索查询,因此可以定义它,这样就不会突出显示合法的查询结果。通常,您应该将搜索查询包含在highlight_query中。

matched_fields

组合多个字段上的匹配以突出显示单个字段。对于以不同方式分析同一字符串的多字段,这是最直观的。所有matched_fields必须将term_vector设置为with_positions_offsets,但是只加载匹配项组合到的字段,因此只有该字段从将store设置为yes中受益。只适用于fvh荧光笔。

no_match_size

如果没有要突出显示的匹配片段,则希望从字段开头返回的文本量。默认值为0(不返回任何值)。

number_of_fragments

返回的片段的最大数量。如果片段的数量设置为0,则不会返回片段。相反,突出显示并返回整个字段内容。当您需要突出显示短文本(如标题或地址),但不需要分段时,这非常方便。如果number_of_fragments为0,则忽略fragment_size。默认为5。

Order

设置为score时,按分数对突出显示的片段进行排序。默认情况下,片段将按照它们在字段中出现的顺序输出(顺序:none)。将此选项设置为score将首先输出最相关的片段。每个荧光笔都应用自己的逻辑来计算相关性得分。有关不同的荧光笔如何找到最佳片段的详细信息,请参阅文档“荧光笔如何在内部工作”。

phrase_limit

控制要考虑的文档中匹配短语的数量。防止fvh荧光笔分析太多的短语和消耗太多的内存。当使用matched_fields时,phrase_limit 会考虑每个匹配字段的短语。提高限制会增加查询时间并消耗更多内存。仅由fvh荧光笔支持。默认为256。

pre_tags

与pre_tags一起使用,定义用于突出显示文本的HTML标记。默认情况下,突出显示的文本被包装在<em>和</em>标记中。指定为字符串数组。

post_tags

与结合使用pre_tags来定义用于突出显示文本的HTML标记。默认情况下,高亮文本被包裹在<em>和</em>标签。指定为字符串数组。

require_field_match

默认情况下,只突出显示包含查询匹配项的字段。将require_field_match设置为false以突出显示所有字段。默认值为true。

tags_schema

设置为使用内置标记模式的styled。样式化的模式定义了以下pre_tags,并将post_tags定义为</em>。

<em class="hlt1">, <em class="hlt2">, <em class="hlt3">,
<em class="hlt4">, <em class="hlt5">, <em class="hlt6">,
<em class="hlt7">, <em class="hlt8">, <em class="hlt9">,
<em class="hlt10">

Type

使用的高光:统一,普通,或fvh。默认为统一。

Highlighting Examples

Override global settings

您可以全局指定高亮设置,并有选择地覆盖各个字段的高亮设置。

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "number_of_fragments" : 3,
        "fragment_size" : 150,
        "fields" : {
            "body" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] },
            "blog.title" : { "number_of_fragments" : 0 },
            "blog.author" : { "number_of_fragments" : 0 },
            "blog.comment" : { "number_of_fragments" : 5, "order" : "score" }
        }
    }
}

Specify a highlight query

可以指定highlight_query,以便在突出显示时考虑其他信息。例如,下面的查询包括highlight_query中的搜索查询和rescore查询。如果没有highlight_query,高亮显示将只考虑搜索查询。

GET /_search
{
    "stored_fields": [ "_id" ],
    "query" : {
        "match": {
            "comment": {
                "query": "foo bar"
            }
        }
    },
    "rescore": {
        "window_size": 50,
        "query": {
            "rescore_query" : {
                "match_phrase": {
                    "comment": {
                        "query": "foo bar",
                        "slop": 1
                    }
                }
            },
            "rescore_query_weight" : 10
        }
    },
    "highlight" : {
        "order" : "score",
        "fields" : {
            "comment" : {
                "fragment_size" : 150,
                "number_of_fragments" : 3,
                "highlight_query": {
                    "bool": {
                        "must": {
                            "match": {
                                "comment": {
                                    "query": "foo bar"
                                }
                            }
                        },
                        "should": {
                            "match_phrase": {
                                "comment": {
                                    "query": "foo bar",
                                    "slop": 1,
                                    "boost": 10.0
                                }
                            }
                        },
                        "minimum_should_match": 0
                    }
                }
            }
        }
    }
}

Set highlighter type

type字段允许强制使用特定的高光类型。允许的值是:统一的、普通的和fvh。下面是一个使用普通荧光笔的例子:

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "fields" : {
            "comment" : {"type" : "plain"}
        }
    }
}

Configure highlighting tags

默认情况下,高亮显示将把突出显示的文本封装在<em>和</em>中。这可以通过设置pre_tags和post_tags来控制,例如:

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "pre_tags" : ["<tag1>"],
        "post_tags" : ["</tag1>"],
        "fields" : {
            "body" : {}
        }
    }
}

当使用快速向量高光器时,可以指定额外的标记,并按“重要性”排序。

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "body" : {}
        }
    }
}

你也可以使用内置样式标签模式:

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "tags_schema" : "styled",
        "fields" : {
            "comment" : {}
        }
    }
}

Highlight on source

强制高亮显示基于源的字段,即使字段是单独存储的。默认值为false。

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "fields" : {
            "comment" : {"force_source" : true}
        }
    }
}

Highlight in all fields

         默认情况下,只突出显示包含查询匹配项的字段。将require_field_match设置为false以突出显示所有字段。 

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "require_field_match": false,
        "fields": {
                "body" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] }
        }
    }
}

组合多个字段上的匹配

警告

这只支持fvh高光

快速向量高亮器可以结合多个字段上的匹配来突出显示单个字段。对于以不同方式分析同一字符串的多字段,这是最直观的。所有matched_fields必须将term_vector设置为with_positions_offsets,但是只加载匹配项组合到的字段,因此只有该字段将store设置为yes才会受益。

在下面的例子中,comment由english analyzer分析和comment.plain由 standard analyzer分析。

GET /_search
{
    "query": {
        "query_string": {
            "query": "comment.plain:running scissors",
            "fields": ["comment"]
        }
    },
    "highlight": {
        "order": "score",
        "fields": {
            "comment": {
                "matched_fields": ["comment", "comment.plain"],
                "type" : "fvh"
            }
        }
    }
}

上面的“run with scissors”和“running with scissors”匹配,会突出显示“running”和“scissors”,而不是“run”。如果两个短语都出现在一个大文档中,那么片段列表中的“runing with scissors”将排在“run with scissors”前面,因为片段中有更多匹配项。

GET /_search
{
    "query": {
        "query_string": {
            "query": "running scissors",
            "fields": ["comment", "comment.plain^10"]
        }
    },
    "highlight": {
        "order": "score",
        "fields": {
            "comment": {
                "matched_fields": ["comment", "comment.plain"],
                "type" : "fvh"
            }
        }
    }
}

上面突出了“run”以及“running”和“scissors”,但是仍然将“running with scissors”放在“run with scissors”上面,因为普通匹配(“running”)得到了增强。

GET /_search
{
    "query": {
        "query_string": {
            "query": "running scissors",
            "fields": ["comment", "comment.plain^10"]
        }
    },
    "highlight": {
        "order": "score",
        "fields": {
            "comment": {
                "matched_fields": ["comment.plain"],
                "type" : "fvh"
            }
        }
    }
}

上面的查询不会突出显示“run”或“scissor”,但是显示了在匹配的字段中组合的匹配(comment)是可以不列出的。

请注意

从技术上讲,向matched_fields添加与组合匹配项的字段不共享相同底层字符串的字段也是可以的。结果可能没有多大意义,如果其中一个匹配项不在文本末尾,那么整个查询将失败。

请注意

将matched_fields设置为非空数组涉及少量开销,因此总是首选 

 "highlight": {
        "fields": {
            "comment": {}
        }
    }

 "highlight": {
        "fields": {
            "comment": {
                "matched_fields": ["comment"],
                "type" : "fvh"
            }
        }
    }

显式顺序突出显示字段

Elasticsearch突出显示字段的发送顺序,但是按照JSON规范,对象是无序的。如果需要显式显示字段突出显示的顺序,请将字段指定为数组:

GET /_search
{
    "highlight": {
        "fields": [
            { "title": {} },
            { "text": {} }
        ]
    }
}

Elasticsearch中内置的highlighters都不关心字段高亮显示的顺序,但是插件可能会关心。

控制高亮的片段

每个高亮显示的字段可以控制高亮显示片段的大小(默认为100),以及返回的片段的最大数量(默认为5)。例如:

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "fields" : {
            "comment" : {"fragment_size" : 150, "number_of_fragments" : 3}
        }
    }
}

最重要的是,可以指定突出显示的片段需要按分数排序:

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "order" : "score",
        "fields" : {
            "comment" : {"fragment_size" : 150, "number_of_fragments" : 3}
        }
    }
}

如果number_of_fragments值设置为0,则不会生成片段,而是返回字段的整个内容,当然还会突出显示它。如果需要突出显示短文本(如文档标题或地址),但不需要分段,那么这将非常方便。注意,在本例中忽略了fragment_size。

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "fields" : {
            "body" : {},
            "blog.title" : {"number_of_fragments" : 0}
        }
    }
}

当使用fvh时,可以使用fragment_offset参数控制开始高亮显示的页边距。

在没有匹配片段要突出显示的情况下,默认情况是不返回任何内容。相反,我们可以通过将no_match_size(默认为0)设置为您想要返回的文本的长度来返回字段开头的文本片段。实际长度可能比指定的要短,也可能比指定的要长,因为它试图打破单词边界。

GET /_search
{
    "query" : {
        "match": { "user": "kimchy" }
    },
    "highlight" : {
        "fields" : {
            "comment" : {
                "fragment_size" : 150,
                "number_of_fragments" : 3,
                "no_match_size": 150
            }
        }
    }
}

Highlight using the postings list

下面是一个在索引映射中设置评论字段的例子,允许使用帖子高亮显示:

PUT /example
{
  "mappings": {
    "properties": {
      "comment" : {
        "type": "text",
        "index_options" : "offsets"
      }
    }
  }
}

下面是一个设置评论字段的例子,允许使用term_vector突出显示(这会导致索引变大):

PUT /example
{
  "mappings": {
    "properties": {
      "comment" : {
        "type": "text",
        "term_vector" : "with_positions_offsets"
      }
    }
  }
}

Specify a fragmenter for the plain highlighter

当使用普通荧光笔,你可以选择simple和span 分段:

GET twitter/_search
{
    "query" : {
        "match_phrase": { "message": "number 1" }
    },
    "highlight" : {
        "fields" : {
            "message" : {
                "type": "plain",
                "fragment_size" : 15,
                "number_of_fragments" : 3,
                "fragmenter": "simple"
            }
        }
    }
}

响应:

{
    ...
    "hits": {
        "total" : {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 1.601195,
        "hits": [
            {
                "_index": "twitter",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.601195,
                "_source": {
                    "user": "test",
                    "message": "some message with the number 1",
                    "date": "2009-11-15T14:12:12",
                    "likes": 1
                },
                "highlight": {
                    "message": [
                        " with the <em>number</em>",
                        " <em>1</em>"
                    ]
                }
            }
        ]
    }
}
GET twitter/_search
{
    "query" : {
        "match_phrase": { "message": "number 1" }
    },
    "highlight" : {
        "fields" : {
            "message" : {
                "type": "plain",
                "fragment_size" : 15,
                "number_of_fragments" : 3,
                "fragmenter": "span"
            }
        }
    }
}

Response:

{
    ...
    "hits": {
        "total" : {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 1.601195,
        "hits": [
            {
                "_index": "twitter",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.601195,
                "_source": {
                    "user": "test",
                    "message": "some message with the number 1",
                    "date": "2009-11-15T14:12:12",
                    "likes": 1
                },
                "highlight": {
                    "message": [
                        " with the <em>number</em> <em>1</em>"
                    ]
                }
            }
        ]
    }
}

如果number_of_fragments选项设置为0,则使用NullFragmenter,它根本不会对文本进行分段。这对于突出显示文档或字段的整个内容非常有用。

荧光笔是如何在内部工作的

给定查询和文本(文档字段的内容),荧光笔的目标是为查询找到最佳文本片段,并在找到的片段中突出显示查询术语。为此,荧光笔需要解决几个问题:

  1. 如何将文本分成片段?
  2. 如何在所有碎片中找到最好的片段?
  3. 如何突出显示片段中的查询项?

如何将文本分成片段?

相关设置:fragment_size、fragmenter、highlighter类型、bordery_chars、bordery_max_scan、bordery_scanner、bordery_scanner_locale。

普通荧光笔首先使用给定的分析器分析文本,并从中创建一个令牌流。Plain highlighter使用一个非常简单的算法将令牌流分解为片段。它循环遍历令牌流中的术语,每当当前术语的end_offset超过fragment_size乘以已创建的片段的数量时,就会创建一个新的片段。使用span fragmenter进行更多的计算,以避免在突出显示的术语之间分割文本。但是总的来说,由于分割只由fragment_size完成,所以有些片段可能非常奇怪,例如以标点符号开始。

使用Java的BreakIterator, Unified或FVH highlighters可以更好地将文本分解为片段。这确保只要fragment_size允许,片段就是一个有效的句子。

如何找到最好的片段?

相关设置:number_of_fragments。

为了找到最佳、最相关的片段,高亮显示需要根据给定的查询为每个片段打分。目标是只对那些参与生成文档命中的术语进行评分。对于一些复杂的查询,这还在进行中。

普通荧光笔从当前令牌流创建内存索引,并通过Lucene的查询执行规划器重新运行原始查询条件,以访问当前文本的低级匹配信息。对于更复杂的查询,可以将原始查询转换为span查询,因为span查询可以更准确地处理短语。然后这个获得的低级匹配信息被用来给每个片段打分。普通荧光笔的计分方法很简单。每个片段都由在该片段中找到的惟一查询项的数量进行评分。单个term的分数等于它的boost,默认值为1。因此,默认情况下,包含一个惟一查询项的片段的得分为1;而包含两个惟一查询项的片段的得分将为2,依此类推。然后根据它们的得分对片段进行排序,因此将首先输出得分最高的片段。

FVH不需要分析文本并构建内存索引,因为它使用预先索引的文档术语向量,并在其中找到与查询相对应的术语。FVH根据在该片段中找到的查询项的数量为每个片段打分。与普通高光笔类似,单个术语的得分等于它的提升值。与普通荧光笔相比,所有查询项都要计算,而不仅仅是惟一的查询项。

统一荧光笔可以使用预索引项向量或预索引项偏移量(如果有的话)。否则,与普通Highlighter类似,它必须从文本创建内存索引。Unified highlighter使用BM25评分模型对片段进行评分。

如何突出显示片段中的查询项?

相关设置: pre-tags, post-tags。

我们的目标是只突出显示那些参与生成文档点击率的术语。对于一些复杂的布尔查询,这仍然在进行中,因为荧光笔不反映查询的布尔逻辑,只提取叶子(术语、短语、前缀等)查询。

给定令牌流和原始文本,使用普通荧光笔重新组合原始文本,仅突出显示来自前一步低级匹配信息结构中包含的令牌流中的术语。

FVH和unified highlighter使用中间数据结构以某种原始形式表示片段,然后用实际文本填充它们。

荧光笔使用前置标签、后置标签对突出显示的术语进行编码。

一个例子的工作,统一的荧光笔

让我们更详细地了解一下unified highlighter是如何工作的。

首先,我们创建一个包含文本字段内容的索引,该索引将使用english analyzer进行索引,并且将在没有偏移量或术语向量的情况下进行索引。

PUT test_index
{
    "mappings": {
        "properties": {
            "content" : {
                "type" : "text",
                "analyzer" : "english"
            }
        }
    }
}

我们将以下文件放入索引中:

PUT test_index/_doc/doc1
{
  "content" : "For you I'm only a fox like a hundred thousand other foxes. But if you tame me, we'll need each other. You'll be the only boy in the world for me. I'll be the only fox in the world for you."
}

我们运行了下面的查询和一个高亮请求:

GET test_index/_search
{
    "query": {
        "match_phrase" : {"content" : "only fox"}
    },
    "highlight": {
        "type" : "unified",
        "number_of_fragments" : 3,
        "fields": {
            "content": {}
        }
    }
}

在发现doc1作为该查询的命中目标之后,这个命中目标将被传递给unified highlighter,用于突出显示文档的字段内容。由于字段内容没有使用偏移量或术语向量建立索引,因此将分析其原始字段值,并根据匹配查询的术语构建内存索引:

{"token":"onli","start_offset":12,"end_offset":16,"position":3},
{"token":"fox","start_offset":19,"end_offset":22,"position":5},
{"token":"fox","start_offset":53,"end_offset":58,"position":11},
{"token":"onli","start_offset":117,"end_offset":121,"position":24},
{"token":"onli","start_offset":159,"end_offset":163,"position":34},
{"token":"fox","start_offset":164,"end_offset":167,"position":35}

我们的复杂短语查询将被转换成span查询:spanNear([text:onli, text:fox], 0, true),这意味着我们正在查找彼此距离为0的terms “onli:”和“fox”,并且按照给定的顺序。span查询将对之前创建的内存索引运行,找到以下匹配项:

{"term":"onli", "start_offset":159, "end_offset":163},
{"term":"fox", "start_offset":164, "end_offset":167}

在我们的示例中,我们有一个匹配项,但是可能有多个匹配项。给定匹配项,统一的荧光笔将字段的文本分割为所谓的“段落”。每个段落必须包含至少一个匹配项。使用Java的BreakIterator的统一荧光笔确保每一段都代表一个完整的句子,只要它不超过fragment_size。在我们的例子中,我们有一个带有以下属性的段落(这里只显示了属性的一个子集):

Passage:
    startOffset: 147
    endOffset: 189
    score: 3.7158387
    matchStarts: [159, 164]
    matchEnds: [163, 167]
    numMatches: 2

请注意一篇文章如何使用适合于文章的BM25评分公式计算分数。如果可用的段落比用户number_of_fragments请求的多,那么分数允许我们选择最佳的计分段落。分数也让我们排序的文章顺序:“分数”,如果用户要求。

作为最后一步,统一高光将从字段的文本中提取对应于每个段落的字符串:

"I'll be the only fox in the world for you."

并将格式标签<em>和</em>所有匹配在这个字符串使用段落的matchstart和matchEnds信息:

I'll be the <em>only</em> <em>fox</em> in the world for you.

这种格式化字符串是返回给用户的荧光笔的最终结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值