我有一个针对webapp的弹性搜索搜索实现,但我仍然坚持最后的细节。我希望能够按字母顺序过滤某些字段。因此,如果我查询'd',它应该带回所有以'd'开头的字段。目前这就是我所拥有的:
$elasticaQueryString = new Elastica_Query_QueryString();
$elasticaQueryString->setDefaultField('Name');
$elasticaQueryString->setQuery('d'.'*');
适用于只有一项工作的字段,即'Dan'。但如果有多个单词,则返回每个关键字的结果。即'Dan Ryan','Ryan Dan'。我也尝试了通配符和前缀查询,但它们给出了类似的结果。
我是否需要创建自定义分析器,还是有其他方法解决此问题?
答案 0 :(得分:6)
我首先会在地图层面解决这个问题。关键字标记生成器将使整个字段成为单个标记,然后添加小写过滤器将小写所有内容...使字段不区分大小写:
"analysis":{
"analyzer":{
"analyzer_firstletter":{
"tokenizer":"keyword",
"filter":"lowercase"
}
}
插入一些数据后,这就是索引所持有的内容:
$ curl -XGET localhost:9200/test2/tweet/_search -d '{
"query": {
"match_all" :{}
}
}' | grep title
"title" : "river dog"
"title" : "data"
"title" : "drive"
"title" : "drunk"
"title" : "dzone"
注意条目“河狗”,这是你想避免匹配的。现在,如果我们使用match_phrase_prefix
查询,您只会匹配那些以'd'开头的查询:
$ curl -XGET localhost:9200/test2/tweet/_search -d '{
"query": {
"match_phrase_prefix": {
"title": {
"query": "d",
"max_expansions": 5
}
}
}
}' | grep title
"title" : "drive"
"title" : "drunk"
"title" : "dzone"
"title" : "data"
这不是Elastica特定的,但转换到适当的命令应该相当容易。重要的部分是keyword
+ lowercase
分析器,然后使用match_phrase_prefix
查询。
作为旁注,通配符非常慢,最好尽可能避免:)