使用elastica启动弹性搜索的查询过滤器

时间:2013-01-31 12:10:52

标签: php rest elasticsearch elastica

我有一个针对webapp的弹性搜索搜索实现,但我仍然坚持最后的细节。我希望能够按字母顺序过滤某些字段。因此,如果我查询'd',它应该带回所有以'd'开头的字段。目前这就是我所拥有的:

$elasticaQueryString = new Elastica_Query_QueryString();
$elasticaQueryString->setDefaultField('Name');
$elasticaQueryString->setQuery('d'.'*');

适用于只有一项工作的字段,即'Dan'。但如果有多个单词,则返回每个关键字的结果。即'Dan Ryan','Ryan Dan'。我也尝试了通配符和前缀查询,但它们给出了类似的结果。

我是否需要创建自定义分析器,还是有其他方法解决此问题?

1 个答案:

答案 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查询。

作为旁注,通配符非常慢,最好尽可能避免:)