考慮一個 Elasticsearch 物體:
{
"id": 123456,
"keywords": ["apples", "bananas"]
}
現在,假設我想通過搜索 來找到這個物體apple。
{
"match" : {
"keywords" : {
"query" : "apple",
"operator" : "AND",
"minimum_should_match" : "75%"
}
}
}
問題是75%陣列的兩個字串都需要最小匹配——所以什么也找不到。有沒有辦法說類似的話minimumSouldMatch: "75% of any array fields"?
請注意,我需要使用AND作為每一項keywords可能由較長的文本組成。
編輯:
我嘗試了建議的解決方案,但沒有一個給出預期的結果。我想問題是文本可能很長,例如:
["national gallery in prague", "narodni galerie v praze"]
我想如果你只是開始搜索“national g”,模糊擴展就不能擴展這么長的字串。
這是否可以通過嵌套物件以某種方式實作?
{ keywords: [{keyword: "apples"}, {keyword: "babanas"}}
然后有minimumShouldMatch=1關鍵字,然后75%每個keyword?
uj5u.com熱心網友回復:
根據檔案
匹配查詢是布爾型別。這意味著對提供的文本進行了分析,分析程序根據提供的文本構造了一個布爾查詢。operator 引數可以設定為 or 或 and 來控制布爾子句(默認為 or)。可以使用 minimum_should_match 引數設定要匹配的可選 should 子句的最小數量。
如果您要搜索多個標記,例如“apples mangoes”并將最小值設定為 100%。這意味著兩個標記都應該出現在檔案中。如果將其設定為 50% ,則意味著至少應存在其中之一。
如果你想部分匹配令牌
您可以使用模糊引數
使用模糊性,您可以設定允許匹配的最大編輯距離
{
"query": {
"match": {
"keywords": {
"query": "apple",
"fuzziness": "auto"
}
}
}
}
如果您嘗試將單詞與其根形式匹配,您可以使用“詞干”標記過濾器
PUT index-name
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [ "stemmer" ]
}
}
}
},
"mappings": {
"properties": {
"keywords":{
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
代幣生成
GET index-name/_analyze
{
"text": ["apples", "bananas"],
"analyzer": "my_analyzer"
}
"tokens" : [
{
"token" : "appl",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "banana",
"start_offset" : 7,
"end_offset" : 14,
"type" : "<ALPHANUM>",
"position" : 101
}
]
詞干分解將單詞分解為詞根形式。
您還可以探索 n-grams、edge grams 以進行部分匹配
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/533379.html
標籤:弹性搜索
上一篇:使用ELK監控KongAPI日志
