elasticsearch - 使用不同大小的搜索文本在弹性搜索中搜索最佳字段
问题描述
假设我们有查询:
GET /_search
{
"query": {
"multi_match" : {
"query": "brown fox",
"type": "best_fields",
"fields": [ "subject", "message" ],
"tie_breaker": 0.3
}
}
}
这将被执行为:
GET /_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "subject": "brown fox" }},
{ "match": { "message": "brown fox" }}
],
"tie_breaker": 0.3
}
}
}
假设如果文本长度仅为 5,则可以搜索字段“消息”。
如何执行将执行的相同逻辑,例如:
GET /_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "subject": "brown fox" }},
{ "match": { "message": "brown" }}
],
"tie_breaker": 0.3
}
}
}
示例取自这里
解决方案
因此,如果您只想对“消息”进行完全匹配(因为棕色是 5 个字母,您可以阅读以下内容: https ://www.elastic.co/guide/en/elasticsearch/guide/master/ _finding_exact_values.html#_finding_exact_values
如果您想在检查长度时与您想要的任何分析器进行匹配,您可以使用分析器来执行字符串长度,并使用另一个来执行匹配。
`
PUT ...index
{
"settings": {
"analysis": {
"analyzer": {
"character_analyzer": {
"type": "custom",
"tokenizer": "character_tokenizer"
}
},
"tokenizer": {
"character_tokenizer": {
"type": "nGram",
"min_gram": 1,
"max_gram": 1
}
}
}
},
"mappings": {
"<object>": {
"properties": {
"message": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
},
"length": {
"type": "token_count",
"analyzer": "character_analyzer"
}
}
}
}
}
}
}
`
然后你应该能够用and条件进行匹配:
`
GET /_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "subject": "brown fox" }},
{ "must" : [
{ "term" : { "message.length" : 5 }},
{ "term" : { "message.keyword" : "brown" }}
]}
],
"tie_breaker": 0.3
}
}
}
`
最后,您还可以使用脚本而不是添加另一个分析器,如本文所述: Kibana querying for string length
`
{
"query": {
"filtered": {
"filter": {
"script": {
"script": "doc['key'].getValue().length() > 5"
}
}
}
}
}
`
推荐阅读
- html - 使列的全宽低于 768px
- sql - 有没有办法在 SQL-Server 中搜索数据库表的所有用途?
- google-apps-script - 将值从一行移动到下一个选项卡,而不在谷歌表格中保留格式
- php - 根据 CodeIgniter 中数据透视表中的类别 ID 显示帖子
- ansible - mysql_replication_role 是默认的还是用户定义的?如果用户定义,我如何在我的剧本中设置它?
- python - 某些字符的正则表达式冲突 (ISO-8859-1 Windows-1252)
- java - 如何在java中解析(分离结构和值)json格式字符串
- chatbot - 仅使用一种意图的意图识别
- git - 如何删除历史 git commit
- javascript - JavaScript-选择其他选择的选项时,请从多个选择框中隐藏选项