2017-09-29 8 views
0

この質問の目標は、フロントエンドでのファセットナビゲーションの実装に関する問題を解決することです。 UIに入力欄があり、ユーザーはすべての項目/すべての指標にわたってあらゆる用語(フルテキスト)を照会することができます。私は、ユーザーが面取りされたナビゲーション(フィルタなど)を使用して結果をペアリングできるようにしたいと思います。ElasticSearch - すべてのフィールドでキーワードを検索し、フィルタを使用して結果をペアにします。

たとえば、ユーザーがキーワード「トムソン」を検索すると、すべてのフィールドを検索する必要があります。次に、ユーザーにフィルタを表す2つ(またはそれ以上)のチェックボックスが表示されます(「地理的位置」と「グループ」とします)。これはANDフィルタでなければなりません。私は無駄に次のElasticSearchクエリを試してみました。

{ 
    "query":{ 
     "bool":{ 
     "must": { 
      "multi_match": { 
       "query": "thomson", 
       "fields": ["*"] 
      } 
     }, 
     "should":[ 
      { 
       "terms":{ 
        "geographicLocation": ["USA", "ENGLAND"] 
       } 
      }, 
      { 
       "terms":{ 
        "Group": ["AA", "BB"] 
       } 
      } 
     ] 
     } 
    } 
} 

それでは、私はESの次のドキュメントを持っているとしましょう:

{ name: 'Joe', street: '3 thomson st', geographicLocation: 'USA', Group: 'AA' } 
{ name: 'Thomson': street: '1 york ave', geographicLocation: 'CHINA', Group: 'BB' } 
{ name: 'Jane', street: '2 jones dr' geographicLocation: 'ENGLAND', Group: 'CC' } 

まず、私はどこかの分野で「トムソン」(例えば、最初の二つのドキュメント上で)を持って結果を取得する必要があります。次に、それらは "USA"または "ENGLAND" AND "AA"または "BB"のいずれかのグループである地理的位置によってフィルタリングされるべきです。

したがって、私は地理的位置がUSAまたはENGLANDで、グループAAまたはBBのいずれかにある文書のどこかに「thomson」という書類が必要です。これは私に最初の文書だけを残す。

私は上記のESパラメータを管理するのは不可能です。

編集:ここに私のマッピングです:

{ 
    "person": { 
    "mappings": { 
     "TEST": { 
     "properties": { 
      "name": { 
      "type": "text" 
      }, 
      "street": { 
      "type": "text" 
      }, 
      "EndDate": { 
      "type": "long" 
      }, 
      "EndDt": { 
      "type": "text", 
      "fields": { 
       "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
       } 
      } 
      }, 
      "Group": { 
      "type": "text", 
      "fields": { 
       "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
       } 
      } 
      }, 
      "d3232b0e1b28bfb8b432a3459404676d:created_date": { 
      "type": "date" 
      }, 
      "d3232b0e1b28bfb8b432a3459404676d:edited": { 
      "type": "date" 
      }, 
      "geographicRegion": { 
      "type": "text", 
      "fields": { 
       "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

わかりません1? – Val

+0

私は次のようにクエリを更新し、私にすべてのヒットを与えていないようだ。 { \t "クエリ":{ \t \t "ブール値":{ \t \t \t "必須":[ \t \t \t \t { "multi_match":{ "クエリ": "トムソン"、 "フィールド":[ "*"]}}、 \t \t \t \t { "という用語は":{ "geographicLocation":[ "USA"、「ENGLAND "]}}、 \t \t \t \t { "用語":{ "グループ":[ "AA"、 "BB"]}} \t \t \t] \t \t} \t}} – sags

+0

また、あなたのインデックスのマッピングを共有することはできますか?私はあなたの 'geographicLocation'と' Group'フィールドが解析された文字列であると思われます – Val

答えて

1

は、単に移動する2つべき必須の句内部の条項あなたは必見内べき句の両方を移動しない理由

{ 
    "query":{ 
     "bool":{ 
     "must": , 
     "must":[ 
      { 
       "multi_match": { 
        "query": "thomson", 
        "fields": ["name", "street"] 
       } 
      }, 
      { 
       "terms":{ 
        "geographicLocation.keyword": ["USA", "ENGLAND"] 
       } 
      }, 
      { 
       "terms":{ 
        "Group.keyword": ["AA", "BB"] 
       } 
      } 
     ] 
     } 
    } 
} 
+0

ありがとうございます。残念ながら、私は 'parse_exception'エラーが発生しています。理由は、「日付フィールド[トムソン]を[strict_date_optional_time || epoch_millis]という形式で解析できませんでした。これは、文字列以外の形式のフィールドで検索するスター検索のためでしょうか? '_all'を検索すると、通常の検索を行うときに機能するようです。 – sags

+0

私はクエリを更新しましたが、今はどうなっていますか?あなたの質問に対する私の2番目のコメントも見てください。 – Val

+0

私のマッピングでオリジナルの質問を編集しました。更新されたクエリは、もはや例外をスローしませんが、実際にヒットしません。 – sags

関連する問題