首页 > 解决方案 > 使用不同大小的搜索文本在弹性搜索中搜索最佳字段

问题描述

假设我们有查询:

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
    }
  }
}

示例取自这里

标签: elasticsearch

解决方案


因此,如果您只想对“消息”进行完全匹配(因为棕色是 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"
                }
            }
        }
    }
}

`


推荐阅读