1

私はwebappでelasticsearch検索を実装していますが、最後の詳細にこだわっています。特定のフィールドをアルファベット順にフィルタリングできるようにしたいと考えています。したがって、「d」を照会すると、そのフィールドの「d」で始まるすべてが返されます。現時点では、これは私が持っているものです:

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

これは、作品が 1 つしかない分野、つまり「段」で機能します。ただし、複数の単語がある場合は、キーワードごとに結果が返されます。つまり、'Dan Ryan'、'Ryan Dan' です。ワイルドカードとプレフィックス クエリも試しましたが、同様の結果が得られます。

カスタム アナライザーを作成する必要がありますか、それともこの問題を回避する方法はありますか?

4

1 に答える 1

6

最初にマッピング レベルでこれに取り組みます。キーワード トークナイザーは、フィールド全体を 1 つのトークンにします。次に、Lowercase フィルターを追加すると、すべてが小文字になります...フィールドの大文字と小文字が区別されなくなります。

"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 に答える