弹性搜索空间

时间:2015-06-23 12:25:57

标签: php elasticsearch

我有一个Elasticsearch设置,允许用户将索引搜索为外卡。

array:3 [
 "index" => "users"
 "type" => "user"
 "body" => array:4 [
 "from" => 0
 "size" => 25
 "sort" => array:1 [
  1 => array:1 [
    "order" => "asc"
  ]
]
"query" => array:1 [
  "bool" => array:1 [
    "should" => array:1 [
      0 => array:1 [
        0 => array:1 [
          "wildcard" => array:1 [
            "full_name" => "john doe"
          ]
        ]
      ]
    ]
  ]
]
]
]

当我将此数组传递给搜索函数时,它返回一个空数组。但是有一个与“John Doe”相关的文档,当我运行"full_name" => "john"时,搜索会返回该文档。

我觉得问题在于空间。

{
"users": {
"user": {
  "properties": {

    "address": {
      "type": "string"
    },
    "full_name": {
      "type": "string"
    },
    "industry_name": {
      "type": "string"
    }
  }
}

} }

3 个答案:

答案 0 :(得分:2)

假设通过elasticsearch分析字段full_name

您的案例中的问题是wildcard query无法分析搜索字符串

  

匹配具有与通配符表达式匹配的字段的文档(不是   分析的)。

在你的情况下,它表示,elasticsearch在倒排索引中存储了johndoe令牌,但是通配符查询正在搜索john doe令牌,并且它失败。

你可以做些什么:

  1. 更改索引映射,因此不再分析full_name字段。 注意:您必须搜索John Doe才能获得匹配,因为 价值未经过分析,因此john doe无法匹配。
  2. 只需离开full_name即可改善第一个解决方案 分析,但使用自定义分析器(通配符,小写)。它会 允许您搜索文字john doeJohn Doe

    {
        "settings" : {
            "index" : {
                "analysis" : {
                    "analyzer" : {
                        "lowercase_analyzer" : {
                            "tokenizer" : "keyword",
                            "filter" : [
                                "lowercase"
                            ],
                            "type" : "custom"
                        }
                    }
                }
            }
        },
        "mappings" : {
            "user" : {
                "properties" : {
                    "id" : {
                        "type" : "integer"
                    },
                    "fullName" : {
                        "analyzer" : "lowercase_analyzer",
                        "type" : "string"
                    }
                }
            }
        }
    }
    
  3. 您可以利用multi field,并搜索原始广告 字段。

    "full_name.raw" => "John Doe"
    
  4. 希望它能帮助您处理用例。

    更新

    Here您可以找到有关如何控制索引映射的更多信息。

答案 1 :(得分:0)

我认为默认情况下会应用标准tokenizer。

在这种情况下,它会将文本john doe视为短语。

所以尝试短语搜索

"full_name" => "\"john doe\""

答案 2 :(得分:0)

如果您想考虑空格,可以执行以下操作:

{
    "match" : {
         "full_name" : {
            "query" : "john doe",
            "operator" : "and",
            "zero_terms_query": "all"
        }
    }
}

检查一下:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html