elasticsearch查询字符串不要按字部分搜索

时间:2015-12-17 09:42:17

标签: elasticsearch query-string

我发送此请求

curl -XGET 'host/process_test_3/14/_search' -d '{
  "query" : {
    "query_string" : {
      "query" : "\"*cor interface*\"",
      "fields" : ["title", "obj_id"]
    }
  }
}'

我得到了正确的结果

{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 5.421598,
    "hits": [
      {
        "_index": "process_test_3",
        "_type": "14",
        "_id": "141_dashboard_14",
        "_score": 5.421598,
        "_source": {
          "obj_type": "dashboard",
          "obj_id": "141",
          "title": "Cor Interface Monitoring"
        }
      }
    ]
  }
}

但是当我想通过单词部分搜索时,例如

curl -XGET 'host/process_test_3/14/_search' -d '
{
  "query" : {
    "query_string" : {
      "query" : "\"*cor inter*\"",
      "fields" : ["title", "obj_id"]
    }
  }
}'

我没有得到任何结果:

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : []
  }
}

我做错了什么?

2 个答案:

答案 0 :(得分:5)

这是因为您的job_A(x=A)字段可能已由标准分析器进行分析(默认设置),标题title已标记为三个标记Cor Interface Monitoring,{{1} }和cor

为了搜索单词的任何子字符串,您需要创建一个利用custom analyzerngram token filter,以便为每个标记的所有子字符串编制索引。

您可以像这样创建索引:

interface

然后您可以重新索引数据。这样做的标题monitoring现在将被标记为:

  • curl -XPUT localhost:9200/process_test_3 -d '{ "settings": { "analysis": { "analyzer": { "substring_analyzer": { "tokenizer": "standard", "filter": ["lowercase", "substring"] } }, "filter": { "substring": { "type": "nGram", "min_gram": 2, "max_gram": 15 } } } }, "mappings": { "14": { "properties": { "title": { "type": "string", "analyzer": "substring_analyzer" } } } } }' Cor Interface Monitoringco
  • cororinintinte
  • interinterfmo

这样您的第二个搜索查询现在将返回您期望的文档,因为代币monmoni现在将匹配。

答案 1 :(得分:1)

+1 Val的解决方案。 只想添加一些东西。 由于您的查询相对简单,因此您可能需要查看match / match_phrase个查询。匹配查询确实具有像query_string一样的正则表达式解析,因此更轻。 您可以在此处找到详细信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html