6

我正在尝试研究如何配置 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

谁能看到我哪里出错了?

谢谢 :)

4

1 回答 1

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

让我知道事情的后续。

于 2013-05-25T05:26:21.753 回答