kro*_*van 1 php rest elasticsearch elastica
我有一个针对webapp的elasticsearch搜索实现,但我仍然坚持最后的细节.我希望能够按字母顺序过滤某些字段.因此,如果我查询'd',它应该带回所有以'd'开头的字段.目前这就是我所拥有的:
$elasticaQueryString = new Elastica_Query_QueryString();
$elasticaQueryString->setDefaultField('Name');
$elasticaQueryString->setQuery('d'.'*');
Run Code Online (Sandbox Code Playgroud)
它适用于只有一个工作的字段,即'Dan'.但如果有多个单词,则返回每个关键字的结果.即'Dan Ryan','Ryan Dan'.我也尝试了通配符和前缀查询,但它们给出了类似的结果.
我是否需要创建自定义分析器或是否有其他方法解决此问题?
我首先要在映射级别解决这个问题.关键字标记生成器将使整个字段成为单个标记,然后添加小写过滤器将小写所有内容...使字段不区分大小写:
"analysis":{
"analyzer":{
"analyzer_firstletter":{
"tokenizer":"keyword",
"filter":"lowercase"
}
}
Run Code Online (Sandbox Code Playgroud)
插入一些数据后,这就是索引所持有的:
$ curl -XGET localhost:9200/test2/tweet/_search -d '{
"query": {
"match_all" :{}
}
}' | grep title
"title" : "river dog"
"title" : "data"
"title" : "drive"
"title" : "drunk"
"title" : "dzone"
Run Code Online (Sandbox Code Playgroud)
注意条目"河狗",这是你想要避免匹配的.现在,如果我们使用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"
Run Code Online (Sandbox Code Playgroud)
这不是Elastica特定的,但它应该相当容易转换为适当的命令.重要的部分是keyword+ lowercase分析器,然后使用match_phrase_prefix查询.
作为旁注,通配符非常慢,最好尽可能避免:)
| 归档时间: |
|
| 查看次数: |
1482 次 |
| 最近记录: |