簡體   English   中英

組合字段的彈性搜索自動完成/部分匹配

[英]Elastic Search autocomplete/ partial matching for combines fields

我在車輛索引中有我的數據:

{
  "mappings": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "@version": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "engine": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "make": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "model": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "year": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

我正在開發搜索功能,用戶可以使用來自 ElasticSearch 的自動建議進行搜索。 目前我正在使用以下查詢:

{
  "query": {
    "multi_match": {
      "query" : "2014 Iko",
      "fields": [
        "make",
        "model",
        "year",
        "engine"
        ],
      "operator": "and"
    }
  }
}

通過上面的查詢,如果我輸入整個單詞,我就可以搜索結果。 例如,如果用戶搜索福特野馬,它會返回所有可能的結果(年份和發動機變化),以福特和野馬作為模型的組合。 問題:問題是當用戶搜索“Ford Musta”時,彈性搜索結果為 0 個結果。 在這種情況下,我希望將福特作為品牌和 Musta 作為型號、年份或引擎的短語的所有選項。

搜索可以按任何順序進行,因此我們希望支持用戶搜索 Mustang Ford 和其他可能的順序。

非常感謝!!

如果你想使用自動完成,你不能使用關鍵字。 您需要使用不同的映射(=> es 需要以不同的方式索引數據)。

如果您想在“模型”和“引擎”上使用自動完成功能,我會加入映射。 如果需要,添加其他字段,或將它們保留為關鍵字。

注意:這顯然會在您的 es 集群上占用更多資源。 注意2:您將不得不重新索引您的數據,看看 _reindex 功能,如果您有任何問題,請咨詢我們。

{
            'settings': {
                "analysis":{
                      "filter":{
                         "name_ngrams":{
                            "max_gram":"20",
                            "type":"edge_ngram",
                            "min_gram":"1",
                            "side":"front"
                         }
                      },
                      "analyzer":{
                         "partial_name":{
                            "type":"custom",
                            "filter":[
                               "lowercase",
                               "name_ngrams",
                               "asciifolding"
                            ],
                            "tokenizer":"standard"
                         },
                         "full_name":{
                            "type":"custom",
                            "filter":[
                               "lowercase",
                               "asciifolding"
                            ],
                            "tokenizer":"standard"
                         }
                      }
                  }
               },
               "mappings":{
                     "properties":{
                        "model":{
                             "type":"text",
                             "analyzer":"partial_name",
                             "search_analyzer":"full_name"
                         },
                        "engine":{
                           "type":"text",
                           "analyzer":"partial_name",
                           "search_analyzer":"full_name"
                        }
                     }
               }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM