2017-01-10 6 views
0

私はelasticsearch内で検索するための特別なケースを持っています。私はまた、ドキュメンテーション、トークナイザ(nグラム、エッジngram)、クエリなどと、結果のないstackoverflow検索に深く見ていた。弾性検索:入力値のインデックス値を持つ部分文字列を検索します。

背景 私はいくつかの文字列フィールド(例:名前、通り、都市、電子メール)を持つ小さなインデックスを持っています。

そして

Loremのイプサムの悲しみのようなクエリは、AMET consectetuerのadipiscingのELIT座ります。 Aeneanコモディティ・ライクラ・エド・ダラー。 Aeneanマッサ。お母さんのお母さんのお母さんのお母さん、お母さんのお母さん、ナスケルの尻尾。ドネケの女子フェリス、究極の必需品、鎮痛剤、鎮痛剤、セム。 Nullaの結果私の名前 quis マイストリート。ドネッペはガチョウ、フリンティアヴェール、アリケットネクスト、忘れて、アーク。 enim justo、rhoncus ut、imperdiet a、venenatis vitae、justoで。 Nullam dictum felis eu pede mollis pretium。整数tincidunt。 Cras dapibus。 Vivamus elementum semis nisi。 Aeneanはeleifend tellusを怒らせる。 Aeneanレオligula、porttitor EU、conが

私が欲しいのはクエリ内のインデックスからで値を検索することです。

インデックスにname = "My-Name"またはstreet = "My-Street"のエントリがある場合、このエントリを返す必要があります。

私が見つけた最も近い投稿はSearch ElasticSearch field contained in a valueでしたが、トークナイザはインデックスから値を分割しました。クエリの部分文字列検索のようなものが必要です。

1)nグラムフィルタ検索アナライザのための唯一のを設定します。

おかげで、よろしく サイモンが可能(ただし、高性能)ソリューションを

答えて

0

を発見しました。インデックス・アナライザは、まだ "標準" である:

  • 設定:

    "analysis": { 
        "filter": { 
         "desc_ngram": { 
          "type": "ngram", 
          "min_gram": 3, 
          "max_gram": 50 
         } 
        }, 
        "analyzer": { 
         "search_ngram": { 
          "type": "custom", 
          "tokenizer": "keyword", 
          "filter": [ "desc_ngram", "lowercase" ] 
         } 
        } 
    } 
    
  • マッピング

    "user": { 
        "properties": { 
         "street": { 
          "type": "string", 
          "analyzer": "standard", 
          "search-analyzer": "search_ngram" 
         } 
        }... 
    } 
    

2)(約小ブロックに入力テキストを分割47文字)

String subtext = request.post.getText().substring(startIndex, offset); 

3)火災アップ各ブロックのelasticsearchに通常のクエリ(非同期的にこれを行う)

 return CompletableFuture.supplyAsync(() -> { 

     SearchRequestBuilder search = this.prepareSearch() 
       .setQuery(QueryBuilders.queryStringQuery(textToAnalyze)) 
       .setSize(100); 

     SearchResponse response = search.get(); 
     UserHit result = transformToHitFrom(response, UserHit.class); 
     return result; 
    }).exceptionally(e -> { 
     logger.error("Error occurred while searching for user", e); 
     UserHit result = new UserHit(); 
     return result; 
    }); 

私はまだパフォーマンス・テストを実行しませんでしたが、私はこのソリューションが持っていることを願っています標準の部分文字列メソッドよりも優れたパフォーマンス私たちは次の日にこれをテストします。

関連する問題