具有多个WHERE子句的SQL语句的弹性搜索查询

时间:2017-01-01 13:57:58

标签: elasticsearch

我需要基于以下SQL语句的弹性搜索查询

SELECT * FROM documents
WHERE (doc_name like "%test%" OR doc_type like "%test%" OR doc_desc like "%test%) AND
user_id = 1 AND doc_category = "Utilities"

2 个答案:

答案 0 :(得分:1)

这取决于你的映射,但你可以开始使用这样的东西:

"query": {
    "filtered": {
        "filter": {
            "bool": {
                "must": [
                    {
                        "term": {
                            "user_id": 1
                        }
                    },
                    {
                        "term": {
                            "doc_category": "Utilities"
                        }
                    }
                ]
            }
        },
        "query": {
            "multi_match": {
                "query": "test",
                "fields": ["doc_name", "doc_type", "doc_desc"]
            }
        }
    }
}

答案 1 :(得分:0)

添加jbasko给出的答案:在 elsaticsearch 中执行 LIKE 查询在很大程度上取决于您对文档字段的映射。例如,如果您想在elasticsearch中使用等效的LIKE '%test%',则需要使用ngram标记生成器:

{
 "settings": {
    "analysis": {
      "analyzer": {
        "some_analyzer_name": {
          "tokenizer": "some_tokenizer_name"
        }
      },
      "tokenizer": {
        "some_tokenizer_name": {
          "type": "ngram",
          "min_gram": <minimum number of characters>,
          "max_gram": <maximum number of characters>,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }

...

并在字段的映射中使用分析器:

"mapping":{
...
"doc_type" : {
"type" :"string",
"analyzer" : "some_analyzer_name"
},
...
"doc_type" : {
"type" :"string",
"analyzer" : "some_analyzer_name"
},
...
}

关于 ngram 的简短说明,此标记生成器将字段doc_type中的字符串和其他字符串分隔为连续字符串,其中包含您在设置中定义的字符数。

即。一个带有

的ngram
min_gram : 1  
max_gram : 3  

字符串“abcd”。

你会得到一系列术语:'a','ab','abc','b','bc','bcd','c','cd','c'。 elasticsearch将使用此术语来使用带反向索引的匹配(或多匹配)查询来查找正确的文档。

如需进一步阅读,您可以在elasticsearch wiki中搜索:mapping,ngram tokenizer和termvectors。