【问题标题】:Elasticsearch build sql server index and create search query failesElasticsearch 构建 sql server 索引并创建搜索查询失败
【发布时间】:2015-08-16 04:04:53
【问题描述】:

阅读并尝试了几篇文章并没有得到任何结果..

我想创建返回数据库结果的弹性搜索查询

示例

[步骤 1]: 我的数据库是 [my_db],我的表名是 [my_table] 在 localhost:9200

上构建新索引
POST /my_index/my_type/_meta 
{
    "type":"jdbc",
    "jdbc": 
    {
        "driver":"com.microsoft.sqlserver.jdbc.SQLServerDriver",
        "url":"jdbc:sqlserver://[my_db_ip];databaseName=[my_db]",
        "user":"sa","password":"xxxxxx",
        "sql":"SELECT * FROM [my_table]",
        "poll":"5s",
        "index": "my_index",
        "type": "my_type"     
    }
}

索引创建结果:

{
   "_index": "my_index",
   "_type": "my_type",
   "_id": "_meta",
   "_version": 1,
   "created": true
}

[步骤 2]: 搜索查询

POST /my_index/_search
{
    "query_string" : {
        "query" : "FreeText"
    }
}

搜索结果

{
   "error": "SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures....
}

我的搜索查询出了什么问题?

如何创建从 [my_table] 行返回结果的查询?

【问题讨论】:

    标签: sql-server elasticsearch query-string


    【解决方案1】:

    尝试 match_all 查询(有关官方文档,请参阅here)。这将为您带来 my_type 的所有结果。

    例子:

    POST /my_index/my_type/_search 
    {
       "query": { "match_all": {} } 
    }
    

    如果您需要搜索某个特定术语,那么您必须注意您的类型的 mappings 和您将使用的 query type

    更新

    映射:

    从您的表格架构中,我了解到以下 my_type 的映射非常适合您。

    {
        "my_table" : {
            "properties" : {
                "orderid" : {"type" : "integer", "index" : "not_analyzed"},
                "ordername " : {"type" : "string" }
            }
        }
    }
    

    请记住,如果数据已编入索引,则无法更改映射。您必须在定义正确的映射后重新索引您的数据。

    通常我建议您遵循以下方法:

    1. 使用您需要的索引设置创建索引
    2. 定义类型的映射
    3. 索引您的数据

    不要将所有这些步骤混为一谈,避免碰运气(如默认映射)。

    您可以使用match query 来搜索文档中某个字段的数据。

    例子

    POST /my_index/my_type/_search 
    {
        "query": { 
            "match": {
               "FIELD": "TEXT"
            }
        } 
    }
    

    您可以使用multi-match query来搜索文档的多个字段的数据。

    例子

    POST /my_index/my_type/_search 
    {
        "query": { 
            "multi_match": {
               "query":    "TEXT", 
               "fields": [ "field1", "field2" ]
            }
        } 
    }
    

    有关更多查询选项,请查看Query DSL 上的官方文档。

    【讨论】:

    • 但是选择结果在哪里呢?我想在 [my_table] 上搜索包含文本“FreeText”的行。
    • POST /my_index/my_type/_search { "query": { "multi_match": { "query": "8304869", "fields": [ "OrderID" ] } } } //没有结果找到{“took”:5,“timed_out”:false,“_shards”:{“total”:5,“成功”:5,“失败”:0},“命中”:{“total”:0,“ max_score": null, "命中": [] } }
    • 请发布您的映射以确定问题。我看到您正在搜索某个整数,并且您可能已将此字段映射到字符串。此外,运行 match_all 查询以确保您有实际数据要搜索(它将为您带来 my_index 中 my_type 的所有文档)。
    • 也许这就是问题所在。我没有创建任何映射。我怎样才能创建一个?我的选择是 [SELECT orderid,ordername FROM my_table]
    • 请阅读我的更新答案和映射。但是,我鼓励您阅读官方文档中的mapping section。了解所有这些的含义很重要。
    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多