天天看點

在Elastic Search同時搜尋多個字段

(作者:www.data-master.net 資料極)

問題:

我是使用elastic search的新手,我想知道如何進行指定一個或多個字段的搜尋。

使用SQL我會寫這個查詢:

"SELECT field1, field2, field3 FROM tablename WHERE field1 = 'X' AND field2 != 'Y' AND field3 = 'Z'"
           

在elastic search中,我是這麼做的:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "query": "*"
                }
            },
            "filter": {
                "term" : {
                    "field1" : "286"
                }
            }
        }
    }
}
           

(作者:www.data-master.net 資料極)

回答1:

您需要為job選擇正确的查詢,這在開始時可能很難。您可以使用bool查詢将各種不同的查詢組合在一起。還有一些查詢允許在多個字段上執行,并在内部映射到布爾查詢。

此外,術語查詢在生産系統中并不常見,因為它們不支援任何文本分析,而我們通常希望用與索引字段的索引方式類似的方式分析查詢。

elastic search中最常見的查詢之一是比對查詢,它适用于單個字段。還有另一個查詢具有一些options,這些options也适用于多個字段,稱為multi_match。這些查詢支援文本分析并且做得非常好。我建議在query_string查詢中使用它們,但是因為需要解析過程,它更強大也更容易出錯。我會說隻有在你特别需要它的某些特性時才使用query_string(例如,在查詢本身中指定字段名稱或布爾運算符),否則請進行比對查詢。

了解查詢和過濾器之間的差別也很重要,請檢視此處了解更多資訊。

并檢視查詢DSL中可用的所有查詢并使用這些查詢,隻是為了感受您可以做的所有不同的事情。

回答2:

sql查詢相當于:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "field1": "X"
          }
        },
        {
          "term": {
            "field3": "Z"
          }
        }
      ],
      "must_not": {
        "term": {
          "field2": "Y"
        }
      }
    }
  }
}
           

無論如何,如果你是新手,我建議你在開始使用elasticsearch之前閱讀一些文檔。

有很多類型的查詢,其中一些取決于您如何建立資料索引,例如對于字元串,您可以在索引時分析字元串(小寫,詞幹,删除停用詞…)。如果您在索引時分析該字段并将其轉換為小寫,我釋出的查詢将永遠不會比對其field1為“X”的doc。

一旦您了解了更好的elastic search,您就可以使用過濾器來改進查詢。

回答3:

我建議從Elastic的簡單查詢開始。它更像SQL,更容易了解。連結:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html

查詢文法看起來像,例如,如果您正在嘗試查找名為John AND姓氏Doe的訪客:

GET /_search
{
  "query": {
    "simple_query_string" : {
        "query": "John + Doe",
        "fields": ["guest"],
        "default_operator": "and"
    }
  }
}
           

如果任何此标準不比對,查詢将不傳回任何命中。此外,您可以在這裡搜尋多個字段,但速度較慢而不是在一個字段上搜尋。此外,根據文檔,簡單查詢支援特殊符号作為邏輯\搜尋運算符:

'+' signifies AND operation | signifies OR operation
 '-' negates a single token " wraps a number of tokens to signify a phrase for searching
 '*' at the end of a term signifies a prefix query