1

我有一个适用于 web 应用程序的弹性搜索搜索实现,但我被困在最后一个细节上。我希望能够按字母顺序过滤某些字段。因此,如果我查询“d”,它应该为该字段带回所有以“d”开头的内容。目前这就是我所拥有的:

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

它适用于只有一项工作的领域,即“丹”。但是如果有多个单词,那么它会返回每个关键字的结果。即“丹瑞安”,“瑞安丹”。我也尝试了通配符和前缀查询,但它们给出了相似的结果。

我需要创建一个自定义分析器还是有其他方法可以解决这个问题?

4

1 回答 1

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"

请注意条目“river dog”,这是您要避免匹配的条目。现在,如果我们使用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查询。

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

于 2013-01-31T13:30:50.400 回答