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的所有數據,並最終使用可搜索字段對此組結果執行匹配。並且不能通過可搜索的文本獲得遠離現實的結果。
感謝。
Alpert,它與你的新結構(雙{}周圍匹配)很好地工作。我也嘗試過**術語**而不是**比賽**並獲得相同的分數。那謝謝啦。我唯一的問題是可搜索字段(映射使用ngrams):如果找到的術語不符合預期,如何停止結果?例如,搜索「beaulieu」會給出2個很好的結果,而98個離這個詞非常遠。得分從11跳到2 ......但這取決於搜索的術語。 –
我可以使用min_score參數,但它是任意模式。 –
檢查minimum_should_match是否適用於您:https://www.elastic.co/guide/en/elasticsearch/guide/current/ngrams-compound-words.html – alpert