Elasticsearch中带有连字符的索引字段

时间:2013-05-22 17:52:53

标签: elasticsearch

我正在尝试设计如何配置elasticsearch,以便我可以在包含连字符的字段上使用通配符进行查询字符串搜索。

我的文件看起来像这样:

{
   "tags":[
      "deck-clothing-blue",
      "crew-clothing",
      "medium"
   ],
   "name":"Crew t-shirt navy large",
   "description":"This is a t-shirt",
   "images":[
      {
         "id":"ba4a024c96aa6846f289486dfd0223b1",
         "type":"Image"
      },
      {
         "id":"ba4a024c96aa6846f289486dfd022503",
         "type":"Image"
      }
   ],
   "type":"InventoryType",
   "header":{
   }
}

我曾尝试使用word_delimiter过滤器和空格标记器:

{
"settings" : {
    "index" : {
        "number_of_shards" : 1,
        "number_of_replicas" : 1
    },  
    "analysis" : {
        "filter" : {
            "tags_filter" : {
                "type" : "word_delimiter",
                "type_table": ["- => ALPHA"]
            }   
        },
        "analyzer" : {
            "tags_analyzer" : {
                "type" : "custom",
                "tokenizer" : "whitespace",
                "filter" : ["tags_filter"]
            }
        }
    }
},
"mappings" : {
    "yacht1" : {
        "properties" : {
            "tags" : {
                "type" : "string",
                "analyzer" : "tags_analyzer"
            }
        }
    }
}
}

但这些是搜索(标签)及其结果:

deck*     -> match
deck-*    -> no match
deck-clo* -> no match

谁能看到我出错的地方?

谢谢:)

1 个答案:

答案 0 :(得分:9)

分析仪很好(虽然我丢失了过滤器),但你的搜索分析器没有指定,因此它使用标准分析器搜索标签字段,它删除连字符然后尝试查询它(运行curl "localhost:9200/_analyze?analyzer=standard" -d "deck-*"看看我的意思)

基本上,“deck- *”被搜索为“deck *”,没有任何单词只有“deck”,所以它失败了。

“deck-clo *”被搜索为“deck clo *”,再次没有单词只是“deck”或以“clo”开头,因此查询失败。

我做了以下修改

"analysis" : {
    "analyzer" : {
        "default" : {
            "tokenizer" : "whitespace",
            "filter" : ["lowercase"] <--- you don't need this, just thought it was a nice touch
        }
    }
}

然后摆脱标签上的特殊分析器

"mappings" : {
    "yacht1" : {
        "properties" : {
            "tags" : {
                "type" : "string"
            }
        }
    }
}

让我知道它是怎么回事。