Elasticsearch" LIKE前缀%"没有额外索引字段的查询?

时间:2017-03-20 15:26:27

标签: elasticsearch

我意识到通过

查询Elasticsearch
GET animals/_search
{
    "query": {
        "match_phrase_prefix": {
            "Title": "ti"
        }
    }
}

返回

  • 木材
  • 老虎
  • 老虎的眼睛 (不需要的)

如果不维护不同的match_phrase_prefix字段只是为了应用此处描述的不同分析器,我如何才能实现真正的match_token_prefix而不是TitleElasticsearch "starts with" first word in phrases

---更新21.03.2017 ---

我需要基于令牌的搜索以及" LIKE前缀%"在字段Title上搜索!!!而且我不想为每个分析器Title_standardTitle_keywordTitle_xyz维护额外的字段。如果我的模型的所有文本属性都应该像这样处理,那将是一场噩梦。除了双数据存储之外,我必须在向客户显示搜索命中之前重新翻译所有属性名称!

(可以使用Elasticsearch 5)

1 个答案:

答案 0 :(得分:0)

为了实现它,您需要修改索引映射,以便不按空格分割您的标记,并将字符串保持为“原样”。这是默认行为,这就是match_phrase_prefix实际工作的方式(与发生在下面的短语跨度相同)。

  • 更新您的地图(重要部分为"tokenizer" : "keyword"):

    curl -XPUT http://localhost:9200/my_animals -d '
    {
       "settings":{
          "analysis":{
             "analyzer":{
                "my_analyzer":{
                   "type":"custom",
                   "tokenizer": "keyword",
                   "filter":[
                      "lowercase"
                   ]
                }
             }
          }
       },
      "mappings": {
        "animal": {
          "properties": {
            "Title": {
              "type":     "string",
              "analyzer": "my_analyzer"
            }
          }
        }
      }
    }'
    
  • 之后,您可以对prefix字段使用纯Title次查询:

    curl -XGET http://localhost:9200/my_animals/_search -d '
    {
        "query": {
            "prefix": {
                "Title": "ti"
            }
        }
    }'