:::info
自动翻译,主要看一下右边的目录结构。很多地方翻译的比较奇怪,可以对照原文看:https://www.elastic.co/guide/en/elasticsearch/reference/7.14/search-suggesters.html
:::
Suggests
使用建议者建议基于所提供文本的类似术语。建议的部分功能仍在开发中。
POST my-index-000001/_search
{
"query": {
"match": {
"message": "tring out Elasticsearch"
}
},
"suggest": {
"my-suggestion": {
"text": "tring out Elasticsearch",
"term": {
"field": "message"
}
}
}
}
请求
建议功能通过使用建议器建议基于所提供文本建议了类似术语。建议请求部分在_search请求中的查询部分旁边定义。如果将查询部分排除在外,则只返回建议。
例子
可根据请求指定若干建议。每个建议都标识为任意名称。在下面的示例中,请提出两个建议。my-suggest-1和my-suggest-2建议都使用term建议者, 但有一个不同的text.
POST _search
{
"suggest": {
"my-suggest-1": {
"text": "tring out Elasticsearch",
"term": {
"field": "message"
}
},
"my-suggest-2": {
"text": "kmichy",
"term": {
"field": "user.id"
}
}
}
}
下面的建议响应示例包括my-suggest-1和my-suggest-2响应。每个建议部分都包含条目。每个条目实际上是建议文本的一个令牌,包含建议条目文本、建议文本中的原始开始偏移和长度,如果发现任意数量的选项。
{
"_shards": ...
"hits": ...
"took": 2,
"timed_out": false,
"suggest": {
"my-suggest-1": [ {
"text": "tring",
"offset": 0,
"length": 5,
"options": [ {"text": "trying", "score": 0.8, "freq": 1 } ]
}, {
"text": "out",
"offset": 6,
"length": 3,
"options": []
}, {
"text": "elasticsearch",
"offset": 10,
"length": 13,
"options": []
} ],
"my-suggest-2": ...
}
}
每个选项阵列包含一个选项对象,该对象包括建议文本、其文档频率和分数与建议的条目文本进行比较。分数的含义取决于使用的建议者。术语建议者的分数基于距离。
全球建议文本
为了避免建议文本的重复,可以定义全球文本。在下方示例中,建议文本在全球范围内定义,并适用于my-suggest-1和my-suggest-2建议。
POST _search
{
"suggest": {
"text" : "tring out Elasticsearch",
"my-suggest-1" : {
"term" : {
"field" : "message"
}
},
"my-suggest-2" : {
"term" : {
"field" : "user"
}
}
}
}
建议文本也可以在上述示例中指定为建议特定选项。建议级别上指定的建议文本凌驾于全球一级的建议文本的覆盖。
术语建议者
term建议者建议基于距离的术语。在建议术语之前,对所提供的建议文本进行分析。建议的术语提供每个分析建议文本令牌。term建议者不考虑作为请求一部分的查询。
常见建议选项:
text | 建议文本。建议文本是需要在全球范围内或根据建议设置的必选方案。 |
---|---|
field | 从字段获取候选人的建议。这是一个必需的选项,需要在全球范围内设置,或者根据建议设置。 |
analyzer | 分析器分析建议文本。默认建议字段的搜索分析器。 |
size | 按建议文本令牌返回的最大更正。 |
sort | 定义建议应如何按建议的文本术语进行排序。两种可能的值: - score:先按分数排序,然后记录频率,然后按术语本身排序。 - frequency:先按文档频率排序,然后按相似性评分,然后按术语本身排序。 |
suggest_mode | 建议模式控制包含的建议或建议的文本术语的控件,建议应建议。可以指定三个可能的值: - missing:仅为不在索引中的建议文本术语提供建议。这是默认值。 - popular:只建议在比原始建议文本术语更多的文档中出现的建议。 - always: 建议任何匹配的建议, 根据建议文本中的术语。 |
其他术语建议选项:
max_edits | 候选人建议的最大距离可以被视为建议。只能是 1 到 2 之间的值。任何其他值都会导致错误请求错误被抛出。默认到 2。 |
---|---|
prefix_length | 必须匹配的最小前缀字符数,才能成为建议的候选者。默认到 1。增加这个数字可提高拼写检查性能。通常拼写错误不会在术语的开头发生。 |
min_word_length | 建议文本术语必须具有的最小长度才能包含。默认到4. |
shard_size | 设置从每个碎片中检索建议的最大数量。在减少阶段,仅根据size选项返回顶部 N 建议。对size选项的默认。将此设置为高于size的值可能很有用,以便以性能为代价获得更准确的文档频率来拼写校正。由于术语在碎片之间划分,拼写校正的碎片级文档频率可能不精确。增加这一点将使这些文档频率更加精确。 |
max_inspections | 一个因素,用于乘以shards_size以检查更多的候选人拼写更正在碎片的水平。可以以性能为代价提高准确性。默认到 5。 |
min_doc_freq | 建议中应显示的文档数量的最小阈值。这可以指定为绝对数或文档数量的相对百分比。这只能通过建议高频术语来提高质量。默认到 0f 且未启用。如果指定了高于 1 值,则数字不能是分数。该选项使用分片级文档频率。 |
max_term_freq | 建议文本令牌可以存在以包含的文档数量的最高阈值。可以是一个相对百分比数字(例如,0.4)或代表文档频率的绝对数字。如果指定了高于 1 值,则无法指定分数。默认到 0.01f。这可以用来排除高频术语 - 通常拼写正确 - 从拼写检查。这也提高了拼写检查性能。该选项使用分片级文档频率。 |
string_distance | 用于比较建议的术语的字符串距离实现。可以指定五个可能的值: - internal: 基于damerau_levenshtein的默认值,但高度优化,用于比较索引内术语的字符串距离。 - damerau_levenshtein: 基于达美劳-莱文施泰因算法的字符串距离算法。 - levenshtein: 基于莱文施泰因距离算法的字符串距离算法。 - jaro_winkler: 基于雅罗-温克勒算法的字符串距离算法。 - ngram: 基于字符 n-克的字符距离算法。 |
短语建议者
“建议者term提供了非常方便的 API,可在一定字符串距离内按令牌方式访问单词备选项。API 允许单独访问流中的每个令牌,而建议选择则留给 API 消费者。然而,通常需要预先选择的建议才能向最终用户提出。phrase建议器在”建议者term的基础上添加了额外的逻辑,以选择整个更正的短语,而不是基于ngram-language模型加权的单个令牌。在实践中,这个建议者将能够根据共发生和频率做出更好的决定。。。
API 示例
一般来说,phrase建议者需要特别绘制前期工作。此页面上的phrase建议示例需要以下映射才能工作。reverse分析仪仅在最后一个示例中使用。
PUT test
{
"settings": {
"index": {
"number_of_shards": 1,
"analysis": {
"analyzer": {
"trigram": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase","shingle"]
},
"reverse": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase","reverse"]
}
},
"filter": {
"shingle": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 3
}
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"fields": {
"trigram": {
"type": "text",
"analyzer": "trigram"
},
"reverse": {
"type": "text",
"analyzer": "reverse"
}
}
}
}
}
}
POST test/_doc?refresh=true
{"title": "noble warriors"}
POST test/_doc?refresh=true
{"title": "nobel prize"}
设置分析器和映射后,您可以在同一地点使用phrase建议器,然后使用”建议者term:
POST test/_search
{
"suggest": {
"text": "noble prize",
"simple_phrase": {
"phrase": {
"field": "title.trigram",
"size": 1,
"gram_size": 3,
"direct_generator": [ {
"field": "title.trigram",
"suggest_mode": "always"
} ],
"highlight": {
"pre_tag": "<em>",
"post_tag": "</em>"
}
}
}
}
}
响应包含由最有可能的拼写更正首先评分的建议。在这种情况下,我们获得了预期的更正”诺贝尔奖”。
{
"_shards": ...
"hits": ...
"timed_out": false,
"took": 3,
"suggest": {
"simple_phrase" : [
{
"text" : "noble prize",
"offset" : 0,
"length" : 11,
"options" : [ {
"text" : "nobel prize",
"highlighted": "<em>nobel</em> prize",
"score" : 0.48614594
}]
}
]
}
}
基本短语建议 API 参数
field | 用于为语言模型进行 n-gram 查找的字段名称,建议者将使用此字段获取统计数据来评分更正。此字段是强制性的。 |
---|---|
gram_size | 设置fieldn 克(带状疱疹)的最大尺寸。如果该字段不包含 n-克(带状疱疹),则应省略或设置为1请注意,弹性搜索试图根据指定field检测克大小。如果该字段使用shingle的过滤器,gram_size设置为max_shingle_size如果不是明确设置)。 |
real_word_error_likelihood | 即使词典中存在术语,也有可能拼写错误。默认值为0.95这意味着 5% 的真实单词拼写错误。 |
confidence | 信任度级别定义了适用于输入短语分数的一个因素,该分数用作其他建议考生的阈值。只有分数高于阈值的考生才会包含在结果中。例如,置信度为1.0只会返回得分高于输入短语的建议。如果设置为0.0则返回前 N 候选人。默认值为1.0. |
max_errors | 被视为拼写错误的术语的最大百分比,以形成更正。此方法接受范围[0..1)中的浮动值作为实际查询词的一小部分,或>=1作为查询词的绝对数。默认值设置为1.0这意味着最多只返回一个拼写错误的术语的更正。请注意,设置此过高可能会对性能产生负面影响。建议使用1或2等低值:否则,在建议呼叫中花费的时间可能会超过查询执行中花费的时间。 |
separator | 用于分离大拉姆字段中的术语的分离器。如果不设置空白字符用作分离器。 |
size | 为每个单独的查询术语生成的考生数量。像3或5这样的低数字通常能产生良好的效果。提高这一点可以提出更高的距离的术语。默认值为5. |
analyzer | 设置分析器进行分析以建议文本。field通过字段的建议字段的搜索分析仪. |
shard_size | 设置从每个碎片中检索建议术语的最大数量。在减少阶段,仅根据size选项返回顶部 N 建议。默认到5. |
text | 设置文本/查询以提供建议。 |
highlight | 设置突出的建议。如果没有提供,则不会返回highlighted字段。如果提供必须包含完全pre_tag和post_tag这是包裹在改变的令牌。如果连续多个令牌被更改,则整个更改令牌的短语被包装,而不是每个令牌。 |
collate | 根据指定的query检查每个建议,以修剪索引中不存在匹配文档的建议。对建议的整理查询仅在建议产生的本地碎片上运行。必须指定query并可以模板化。请参阅搜索模板。当前建议自动作为{{suggestion}}变量提供,该变量应用于您的查询。您仍然可以指定自己的模板params-suggestion值将添加到您指定的变量中。此外,您可以指定prune以控制是否将返回所有短语建议;当设置为true时,建议将有一个额外的选项collate_match这将是true,如果匹配的文件的短语被发现,false的。prune的默认值是false的. |
POST test/_search
{
"suggest": {
"text" : "noble prize",
"simple_phrase" : {
"phrase" : {
"field" : "title.trigram",
"size" : 1,
"direct_generator" : [ {
"field" : "title.trigram",
"suggest_mode" : "always",
"min_word_length" : 1
} ],
"collate": {
"query": {
"source" : {
"match": {
"{{field_name}}" : "{{suggestion}}"
}
}
},
"params": {"field_name" : "title"},
"prune": true
}
}
}
}
}
此查询将针对每个建议运行一次。 | |
---|---|
{{suggestion}}变量将被每个建议的文本所取代。 | |
附加field_name变量已在params中指定,并由match查询使用。 | |
所有建议将返回,并额外collate_match选项,指示生成的短语是否与任何文档匹配。 |
平滑模型
phrase建议器支持多个平滑模型,以平衡指数中不存在的不常克(克(带状疱疹)和常用克(在索引中至少出现一次)之间的重量。平滑模型可以通过将smoothing参数设置为以下选项之一来选择。每个平滑模型都支持可配置的特定属性。
stupid_backoff | 一个简单的退机模型,如果较高的订单计数是0则退到低阶 n-gram 型号,并且通过恒定的因素对低阶 n-gram 模型进行折扣。默认discount为0.4愚蠢的退让是默认模型。 |
---|---|
laplace | 平滑模型,使用添加剂平滑,其中常数(通常1.0或更小)添加到所有计数以平衡重量。默认alpha为0.5. |
linear_interpolation | 一种平滑模型,根据用户提供的重量(兰布达斯),采用单克、大拉姆和三克的加权平均值。线性插值没有任何默认值。所有参数(trigram_lambda、bigram_lambda、unigram_lambda)必须提供。 unigram_lambdatrigram_lambda bigram_lambda |
POST test/_search
{
"suggest": {
"text" : "obel prize",
"simple_phrase" : {
"phrase" : {
"field" : "title.trigram",
"size" : 1,
"smoothing" : {
"laplace" : {
"alpha" : 0.7
}
}
}
}
}
}
候选发电机
phrase建议者使用候选生成器在给定文本中生成每个术语的可能术语列表。单个候选生成器类似于文本中每个term的术语建议者。然后,发电机的输出与其他建议候选人的候选者一起评分。
目前只有一种类型的候选发电机被支持direct_generator该短语建议 API 接受关键direct_generator下的发电机列表:列表中的每一个生成器在原始文本中每个术语都调用。
直接发电机
直接发电机支持以下参数:
field | 从字段获取候选人的建议。这是一个必需的选项,需要在全球范围内设置,或者根据建议设置。 |
---|---|
size | 按建议文本令牌返回的最大更正。 |
suggest_mode | 建议模式控制每个碎片上生成的建议中包含哪些建议。除always外,所有值都可以被视为一种优化,以生成更少的建议来测试每个碎片,并且在组合每个碎片上生成的建议时不会重新检查。因此missing其他碎片包含碎片,缺失也会生成不包含碎片的术语的建议。这些应该用confidence过滤掉。可以指定三个可能的值: - missing:只生成不分片中的术语的建议。这是默认值。 - popular:只建议在碎片上出现的术语比原始术语多。 - always: 建议任何匹配的建议, 根据建议文本中的术语。 |
max_edits | 候选人建议的最大距离可以被视为建议。只能是 1 到 2 之间的值。任何其他值都会导致错误请求错误被抛出。默认到 2。 |
prefix_length | 必须匹配的最小前缀字符数为候选建议。默认到 1。增加这个数字可提高拼写检查性能。通常拼写错误不会在术语的开头发生。 |
min_word_length | 建议文本术语必须具有的最小长度才能包含。默认到 4。 |
max_inspections | 一个因素,用于乘以shards_size以检查更多的候选人拼写更正在碎片的水平。可以以性能为代价提高准确性。默认到 5。 |
min_doc_freq | 建议中应显示的文档数量的最小阈值。这可以指定为绝对数或文档数量的相对百分比。这只能通过建议高频术语来提高质量。默认到 0f 且未启用。如果指定了高于 1 值,则数字不能是分数。该选项使用分片级文档频率。 |
max_term_freq | 建议文本令牌可以存在以包含的文档数量的最高阈值。可以是一个相对百分比数字(例如,0.4)或代表文档频率的绝对数字。如果指定了高于 1 值,则无法指定分数。默认到 0.01f。这可以用来排除高频术语 - 通常拼写正确 - 从拼写检查。这也提高了拼写检查性能。该选项使用分片级文档频率。 |
pre_filter | 应用于传递给该候选生成器的每个令牌的过滤器(分析仪)。此筛选器在生成候选人之前应用于原始令牌。 |
post_filter | 在将每个生成的令牌传递给实际短语记分器之前,该过滤器(分析仪)将应用于每个生成的令牌。 |
下列示例显示了一个phrase建议使用两个生成器进行呼叫:第一个使用包含普通索引字的字段,第二个使用使用反reverse过滤器索引的字段(令牌是反向顺序的索引)。这用于克服直接发电机的局限性,需要固定前缀才能提供高性能建议。pre_filter和post_filter选项接受普通分析器名称。
POST test/_search
{
"suggest": {
"text" : "obel prize",
"simple_phrase" : {
"phrase" : {
"field" : "title.trigram",
"size" : 1,
"direct_generator" : [ {
"field" : "title.trigram",
"suggest_mode" : "always"
}, {
"field" : "title.reverse",
"suggest_mode" : "always",
"pre_filter" : "reverse",
"post_filter" : "reverse"
} ]
}
}
}
}
pre_filter和post_filter也可以用来在候选人产生后注入同义词。例如,对于查询captain usq我们可能会生成一个usa这个词usq这是america同义词。这允许我们呈现captain america给用户,如果这句话得分足够高。
完成建议器
completion建议器提供自动完成/即用即用式搜索功能。这是一个导航功能,引导用户在打字时获得相关结果,提高搜索精度。它不是用于拼写校正或像term或phrase建议者这样的”你意味着”功能。
理想情况下,自动完成的功能应与用户类型一样快,以提供与用户已经输入的内容相关的即时反馈。因此,completion建议器针对速度进行了优化。建议者使用数据结构,使快速查找,但造价昂贵,并存储在内存中。
映射
要使用此功能,请指定该字段的特殊映射,该映射可对快速完成的字段值进行索引。
PUT music
{
"mappings": {
"properties": {
"suggest": {
"type": "completion"
},
"title": {
"type": "keyword"
}
}
}
}
映射支持以下参数:
analyzer | 要使用的索引分析仪,默认为simple. |
---|---|
search_analyzer | 要使用的搜索分析仪,默认为analyzer的价值. |
preserve_separators | 保留分离器,默认为true。如果禁用,你可以找到一个领域开始与Foo Fighters,如果你建议foof. |
preserve_position_increments | 启用仓位增量,默认为true。如果禁用和使用句号分析仪,你可以得到一个领域开始The Beatles,如果你建议b注意:你也可以通过索引两个输入,Beatles和The Beatles,没有必要改变一个简单的分析仪,如果你能够丰富你的数据。 |
max_input_length | 将单个输入的长度默认值限制为50个 UTF-16 代码点。此限制仅在索引时间用于减少每个输入字符串的字符总数,以防止大量输入膨胀基础数据结构。大多数使用案例不会受到默认值的影响,因为前缀完成时间很少超过前缀的时间超过少数字符。 |
索引
您像任何其他字段一样索引建议。建议由input和可选weight属性组成。input是预期文本与建议查询相匹配,weight决定建议的评分方式。对建议进行索引如下:
PUT music/_doc/1?refresh
{
"suggest" : {
"input": [ "Nevermind", "Nirvana" ],
"weight" : 34
}
}
支持以下参数:
input | 要存储的输入,这可以是字符串的阵列或只是一个字符串。此字段是强制性的。 此值不能包含以下 UTF-16 控制字符: - \u0000 (空) - \u001f信息分离器一) - \u001e (信息分离器二) |
---|---|
weight | 正整数或包含正整数的字符串,它定义了权重,并允许您对建议进行排名。此字段是可选的。 |
您可以为文档索引多个建议,具体如下:
PUT music/_doc/1?refresh
{
"suggest": [
{
"input": "Nevermind",
"weight": 10
},
{
"input": "Nirvana",
"weight": 3
}
]
}
您可以使用以下速记表单。请注意,您无法以速记形式指定带有建议的重量。
PUT music/_doc/1?refresh
{
"suggest" : [ "Nevermind", "Nirvana" ]
}
查询
建议工作照常进行,但您必须指定建议类型作为completion。建议是近乎实时的,这意味着新的建议可以通过刷新和文件删除后永远不会显示可见。此请求:
POST music/_search?pretty
{
"suggest": {
"song-suggest": {
"prefix": "nir",
"completion": {
"field": "suggest"
}
}
}
}
用于搜索建议的前缀 | |
---|---|
建议类型 | |
要搜索建议的字段名称 |
返回此响应:
{
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits": ...
"took": 2,
"timed_out": false,
"suggest": {
"song-suggest" : [ {
"text" : "nir",
"offset" : 0,
"length" : 3,
"options" : [ {
"text" : "Nirvana",
"_index": "music",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"suggest": ["Nevermind", "Nirvana"]
}
} ]
} ]
}
}
_source启用_source元数据字段(默认行为)以启用返回_source的建议。
建议的配置重量返回为_scoretext字段使用您的索引建议的input。建议默认退回_source完整文档。由于磁盘取取和网络传输开销_source的大小可能会影响性能。为了节省一些网络开销,使用源过滤从_source过滤掉不必要的字段,以最大限度地减少_source大小。请注意,_suggest端点不支持源筛选,但使用_search端点的建议确实如此:
POST music/_search
{
"_source": "suggest",
"suggest": {
"song-suggest": {
"prefix": "nir",
"completion": {
"field": "suggest",
"size": 5
}
}
}
}
过滤源,仅返回suggest字段 | |
---|---|
要搜索建议的字段名称 | |
要返回的建议数量 |
这应该看起来像:
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"suggest": {
"song-suggest": [ {
"text": "nir",
"offset": 0,
"length": 3,
"options": [ {
"text": "Nirvana",
"_index": "music",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"suggest": [ "Nevermind", "Nirvana" ]
}
} ]
} ]
}
}
基本完成建议器查询支持以下参数:
field | 运行查询的字段名称(需要)。 |
---|---|
size | 返回的建议数(默认值为5). |
skip_duplicates | 是否应筛选出重复建议(默认为false). |
完成建议人考虑索引中的所有文档。请参阅上下文建议器,了解如何查询文档子集的解释。
如果完成查询跨越多个碎片,则建议分两个阶段执行,其中最后一阶段从碎片中获取相关文档,这意味着当建议跨越多个碎片时,对单个碎片执行完成请求更具执行力,因为文档获取开销。为了获得最佳完成性能,建议将完成数指数分为单个分项索引。如果由于碎片大小而大量使用,仍建议将索引分解成多个碎片,而不是优化完成性能。
跳过重复建议
查询可以返回来自不同文档的重复建议。可以通过将skip_duplicates设置为真实来修改此行为。设置后,此选项会筛选出带有重复结果建议的文档。
POST music/_search?pretty
{
"suggest": {
"song-suggest": {
"prefix": "nor",
"completion": {
"field": "suggest",
"skip_duplicates": true
}
}
}
}
设置为真实时,此选项可以减慢搜索速度,因为需要访问更多建议才能找到顶部 N。
模糊查询
完成建议者还支持模糊查询 - 这意味着您可以在搜索中输入错误,并且仍然可以获取结果。
POST music/_search?pretty
{
"suggest": {
"song-suggest": {
"prefix": "nor",
"completion": {
"field": "suggest",
"fuzzy": {
"fuzziness": 2
}
}
}
}
}
共享prefix缀最长前缀的建议得分更高。
模糊查询可以采取特定的模糊参数。支持以下参数:
fuzziness | 模糊因素,默认为AUTO。有关允许的设置,请参阅模糊。 |
---|---|
transpositions | 如果设置为true,则转换将计为一个更改而不是两个更改,默认为true |
min_length | 返回模糊建议之前输入的最小长度,默认3 |
prefix_length | 未检查模糊备选项的输入的最小长度默认为1 |
unicode_aware | 如果true,则所有测量(如模糊距离、转换和长度)均以 Unicode 代码点而不是字节进行测量。这比原始字节稍慢,因此默认情况下会设置为false。 |
如果您想坚持默认值,但仍使用模糊值,您可以使用fuzzy: {}fuzzy: true.
雷格克斯查询
完成建议者还支持 regex 查询,这意味着您可以将前缀表示为常规表达
POST music/_search?pretty
{
"suggest": {
"song-suggest": {
"regex": "n[ever|i]r",
"completion": {
"field": "suggest"
}
}
}
}
regex 查询可以采取特定的 regex 参数。支持以下参数:
flags | 可能的旗帜是ALL(默认),ANYSTRING,COMPLEMENT,EMPTY,INTERSECTION,INTERVAL,或NONE。请参阅重新语法语法,了解其含义 |
---|---|
max_determinized_states | 常规表达是危险的,因为很容易意外地创建一个无害的,需要指数数的内部确定自动机状态(和相应的RAM和CPU)的Lucene执行。Lucene 使用max_determinized_states设置(默认到 10000)来防止这些情况的发生。您可以提高此限制,以便执行更复杂的常规表达式。 |
上下文建议者
完成建议人会考虑索引中的所有文档,但通常最好提供经筛选和/或由某些标准提升的建议。例如,您希望建议由某些艺术家筛选的歌曲标题,或者您希望根据其流派提升歌曲标题。
要实现建议筛选和/或提升,您可以在配置完成字段时添加上下文映射。您可以为完成字段定义多个上下文映射。每个上下文映射都有一个唯一的名称和类型。有两种类型:category和geo。上下文映射在场映射中的contexts参数下配置。
在索引和查询启用上下文的完成字段时,必须提供上下文。
下列定义类型,每个类型都有两个完成字段的上下文映射:
PUT place
{
"mappings": {
"properties": {
"suggest": {
"type": "completion",
"contexts": [
{
"name": "place_type",
"type": "category"
},
{
"name": "location",
"type": "geo",
"precision": 4
}
]
}
}
}
}
PUT place_path_category
{
"mappings": {
"properties": {
"suggest": {
"type": "completion",
"contexts": [
{
"name": "place_type",
"type": "category",
"path": "cat"
},
{
"name": "location",
"type": "geo",
"precision": 4,
"path": "loc"
}
]
},
"loc": {
"type": "geo_point"
}
}
}
}
定义一个名为place_type类别的category上下文,其中必须随建议一起发送类别。 | |
---|---|
定义指定位置的geo上下文,其中必须发送类别与建议。 | |
定义categoryplace_type类别从cat场读取的类别上下文。 | |
定义从loc字段中读取类别的geo上下文指定位置。 |
添加上下文映射可增加完成字段的索引大小。完成指数完全是堆居民,您可以使用指数统计监控完成现场索引大小.
类别上下文
category上下文允许您在索引时间将一个或多个类别与建议关联。在查询时间,建议可以由其关联类别进行筛选和提升。
映射设置类似于上面place_type字段。如果path被定义,则从文档中的路径中读取类别,否则它们必须发送到建议字段中:如果该类别是从文档中的路径中读取的,则必须将它们发送到建议字段中:
PUT place/_doc/1
{
"suggest": {
"input": [ "timmy's", "starbucks", "dunkin donuts" ],
"contexts": {
"place_type": [ "cafe", "food" ]
}
}
}
这些建议将与咖啡馆和食品类别相关联。 | |
---|---|
如果映射有path,则以下索引请求将足以添加类别:
PUT place_path_category/_doc/1
{
"suggest": ["timmy's", "starbucks", "dunkin donuts"],
"cat": ["cafe", "food"]
}
这些建议将与咖啡馆和食品类别相关联。 | |
---|---|
如果上下文映射引用另一个字段,并且对类别进行了明确索引,则建议将与两组类别进行索引。
类别查询
建议可以按一个或多个类别进行筛选。以下按多个类别筛选建议:
POST place/_search?pretty
{
"suggest": {
"place_suggestion": {
"prefix": "tim",
"completion": {
"field": "suggest",
"size": 10,
"contexts": {
"place_type": [ "cafe", "restaurants" ]
}
}
}
}
}
如果查询上设置了多个类别或类别上下文,则它们将合并为分离。这意味着,如果建议包含至少一个提供的上下文值,则它们会匹配。
某些类别的建议可以比其他类别的推荐人提高。以下按类别筛选建议,并额外提升与某些类别相关的建议:
POST place/_search?pretty
{
"suggest": {
"place_suggestion": {
"prefix": "tim",
"completion": {
"field": "suggest",
"size": 10,
"contexts": {
"place_type": [
{ "context": "cafe" },
{ "context": "restaurants", "boost": 2 }
]
}
}
}
}
}
上下文查询过滤与类别咖啡馆和餐馆相关的建议,并将与餐馆相关的建议提高2倍 | |
---|---|
除了接受类别值外,上下文查询还可以由多个类别上下文子句组成。category类别上下文子句的以下参数:
context | 要筛选/提升的类别的价值。这是强制性的。 |
---|---|
boost | 建议的分数应增加的因素,分数的计算方法是将提升与建议权重乘以1 |
prefix | 类别值是否应被视为前缀。例如,如果设置为true,您可以通过指定类型前缀来筛选类型 1、类型 2等类别。默认为false |
如果建议条目与多个上下文匹配,则最终分数将计算为任何匹配上下文产生的最大分数。
地理位置上下文
geo上下文允许您将一个或多个地理点或地理位置与指数时间的建议关联在一起。在查询时间,如果建议位于指定地理位置的一定距离内,则可以筛选和提升建议。
在内部,地理点被编码为具有指定精度的地理位置。
地理映射
除path设置外,geo上下文映射还接受以下设置:
precision | 这定义了要索引的地理哈什的精度,可以指定为距离值5m10km等),或原始地理哈什精度112默认为原始地理哈什精度值6. |
---|---|
索引时间precision设置设定了查询时间可使用的最大地理哈希精度。
索引地理上下文
geo上下文可以明确设置建议,也可以通过path参数(类似于category上下文)从文档中的地理点字段进行索引。将多个地理位置上下文与建议关联在一起,将针对每个地理位置对建议进行索引。以下索引具有两个地理位置上下文的建议:
PUT place/_doc/1
{
"suggest": {
"input": "timmy's",
"contexts": {
"location": [
{
"lat": 43.6624803,
"lon": -79.3863353
},
{
"lat": 43.6624718,
"lon": -79.3873227
}
]
}
}
}
地理位置查询
建议可以过滤和提升,以了解它们离一个或多个地理点有多近。以下过滤属于地理点编码地理哈什所表示区域的建议:
POST place/_search
{
"suggest": {
"place_suggestion": {
"prefix": "tim",
"completion": {
"field": "suggest",
"size": 10,
"contexts": {
"location": {
"lat": 43.662,
"lon": -79.380
}
}
}
}
}
}
当指定查询时间精度较低的位置时,将考虑属于该区域内的所有建议。
如果查询上设置了多个类别或类别上下文,则它们将合并为分离。这意味着,如果建议包含至少一个提供的上下文值,则它们会匹配。
在以地理哈什为代表的区域内的建议也可以比其他建议更高,如下所示:
POST place/_search?pretty
{
"suggest": {
"place_suggestion": {
"prefix": "tim",
"completion": {
"field": "suggest",
"size": 10,
"contexts": {
"location": [
{
"lat": 43.6624803,
"lon": -79.3863353,
"precision": 2
},
{
"context": {
"lat": 43.6624803,
"lon": -79.3863353
},
"boost": 2
}
]
}
}
}
}
}
上下文查询筛选属于地理位置(43.662,-79.380)表示的地理位置下的建议,精度为2,并提升属于 geohash 表示(43.6624803,-79.3863353)下的建议,默认精度为6乘2 | |
---|---|
如果建议条目与多个上下文匹配,则最终分数将计算为任何匹配上下文产生的最大分数。
除了接受上下文值之外,上下文查询还可以由多个上下文子句组成。支持下列参数作为geo上下文子句:
context | 地理点对象或地理哈希字符串来过滤或提升建议。这是强制性的。 |
---|---|
boost | 建议的分数应增加的因素,分数的计算方法是将提升与建议权重乘以1 |
precision | 地理哈什编码查询地理点的精度。这可以指定为距离值5m10km等),或用作原始地理哈希精度112默认到索引时间精度水平。 |
neighbours | 接受一系列应考虑邻近地海的精确值。精度值可以是距离值5m10km等)或原始地理哈希精度112默认生成邻居的指数时间精度水平。 |
返回建议器的类型
有时,您需要知道建议者的确切类型,以便分析其结果。typed_keys参数可用于在响应中更改建议人的姓名,以便按其类型进行前缀。
考虑以下示例,包括两个建议词term和phrase:
POST _search?typed_keys
{
"suggest": {
"text" : "some test mssage",
"my-first-suggester" : {
"term" : {
"field" : "message"
}
},
"my-second-suggester" : {
"phrase" : {
"field" : "message"
}
}
}
}
在答复中,建议人姓名将分别改为term#my-first-suggester”和phrase#my-second-suggester以反映每个建议的类型:
{
"suggest": {
"term#my-first-suggester": [
{
"text": "some",
"offset": 0,
"length": 4,
"options": []
},
{
"text": "test",
"offset": 5,
"length": 4,
"options": []
},
{
"text": "mssage",
"offset": 10,
"length": 6,
"options": [
{
"text": "message",
"score": 0.8333333,
"freq": 4
}
]
}
],
"phrase#my-second-suggester": [
{
"text": "some test mssage",
"offset": 0,
"length": 16,
"options": [
{
"text": "some test message",
"score": 0.030227963
}
]
}
]
},
...
}
my-first-suggester的名字现在包含term前缀。 | |
---|---|
my-second-suggester的名字现在包含phrase前缀。 |