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

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'.我也尝试了通配符和前缀查询,但它们给出了类似的结果.

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

Zac*_*ach 6

我首先要在映射级别解决这个问题.关键字标记生成器将使整个字段成为单个标记,然后添加小写过滤器将小写所有内容...使字段不区分大小写:

"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查询.

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