2016-05-10 248 views
0

其實我可以用這個進行簡單的匹配搜索:ElasticSearch匹配多個字段

query: {match: {searchable: {query:search}}} 

這種運作良好,我的搜索字段在我的圖譜分析。

現在我想對多個字段執行搜索:1個字符串,其他都是數字。

我的映射:

mappings dynamic: 'false' do 
     indexes :searchable, analyzer: "custom_index_analyzer", search_analyzer: "custom_search_analyzer" 
     indexes :year, type: "integer" 
     indexes :country_id, type: "integer" 
     indexes :region_id, type: "integer" 
     indexes :appellation_id, type: "integer" 
     indexes :category_id, type: "integer" 
     end 

def as_indexed_json(options={}) 
     as_json(
     only: [:searchable, :year, :country_id, :region_id, :appellation_id, :category_id] 
    ) 
    end 

我已經試過這樣:

query: { 
        filtered: { 
         query: { 
         match: { 
          searchable: search 
         } 
         }, 
         filter: { 
         term: { 
          country_id: "1" 
         }, 
         term: { 
          region_id: "2" 
         }, 
         term: { 
          appellation_id: "34" 
         } 
         } 
        } 
        }, 
        sort: { 
        _score: { 
         order: :desc 
        }, 
        year: { 
         order: :desc, 
         ignore_unmapped: true 
        } 
        }, 
        size:100 

它運作良好,但它會給我100個結果在所有情況下,從發送(34)的appellation_id,即使可搜索字段離文本搜索很遠。

我也嘗試了布爾查詢:

self.search(query: { 
       bool: { 
        must: [ 
        { 
         match: { 
          country_id: "1" 
          }, 
          match: { 
          region_id: "2" 
          }, 
          match: { 
          appellation_id: "34" 
          }, 
          match: { 
          searchable: search 
          } 
        } 
        ] 
       } 
       }, 
       sort: { 
       _score: { 
        order: :desc 
       }, 
       year: { 
        order: :desc, 
        ignore_unmapped: true 
       } 
       }, 
       size:100 
      ) 

但它會給我相匹配的搜索領域的所有結果,不會照顧appellation_id的通緝。

我的目標是獲得最佳結果和性能,並要求ES向我提供來自country_id = X,region_id = Y,appellation_id = Z的所有數據,並最終使用可搜索字段對此組結果執行匹配。並且不能通過可搜索的文本獲得遠離現實的結果。

感謝。

回答

0

如您所知elasticsearch match查詢返回結果基於relevance score。您可以嘗試使用term查詢而不是匹配查找精確詞條匹配。此外,我猜你的布爾查詢結構必須是這樣的:

bool: { 
     must: [ 
      { match: { 
       country_id: "1" 
       }}, 
      {match: { 
      region_id: "2" 
      }}, 
      {match: { 
      appellation_id: "34" 
      }}, 
      {match: { 
      searchable: search 
      }} 
     ] 
    } 
+0

Alpert,它與你的新結構(雙{}周圍匹配)很好地工作。我也嘗試過**術語**而不是**比賽**並獲得相同的分數。那謝謝啦。我唯一的問題是可搜索字段(映射使用ngrams):如果找到的術語不符合預期,如何停止結果?例如,搜索「beaulieu」會給出2個很好的結果,而98個離這個詞非常遠。得分從11跳到2 ......但這取決於搜索的術語。 –

+0

我可以使用min_score參數,但它是任意模式。 –

+0

檢查minimum_should_match是否適用於您:https://www.elastic.co/guide/en/elasticsearch/guide/current/ngrams-compound-words.html – alpert