elasticsearch - 使用单个查询字符串和任意顺序的单词查询多个字段

标签 elasticsearch

我以为这个场景一定很常见,但我找不到任何关于如何进行的线索。

我有一个包含单一类型 Order 的 elasticsearch 索引。反过来,Order包含Customer信息,比如firstName, lastName, middleName (以及它们的串联 fullName),例如

"order": {
    // other stuff
    "customer": {
        "firstName": ...,
        "lastName": ...,
        "middleName": ...,
        "fullName": "FirstName MiddleName LastName"
    }
}

目的是提供订单搜索功能,包括按客户姓名搜索。 elastic 的输入始终是单个查询字符串,包含用户在搜索框中输入的任何内容。问题是有一些脏数据(例如,缺少名字、交换名字和姓氏等),我不能依赖用户总是按特定顺序输入名字。

我试过用这样的 query_string 查询来实现:

"query_string": {
    "query": "[User Input]*", // note asterisk here
    "fields" : ["customer.firstName", "customer.lastName", "customer.middleName"],
    "analyzer": "whitespace",
    "use_dis_max": true,
    "tie_breaker": 0.7,
    "analyze_wildcard": true
}

它在某些情况下可以很好地找到结果,但它对脏数据绝对不稳健,例如如果搜索“John Do”(不是拼写错误),它会找到 John Doe 的命令,但如果搜索“Doe John”,它会失败。

所需的查询行为类似于 match_phrase_prefix 在多个字段上使用 whitespace 分析器来处理查询并对出现的每个 术语添加前缀从分析仪。例如,John Doe 将变成类似["John*", "Doe*"] 的内容,并且每个都应用于

  • firstNamelastNamemiddleName 字段
  • fullName 允许个别条款以任何顺序出现

我真的是 elastic 的新手,所以我可能会遗漏一些非常简单的东西,或者没有足够的信心来编写非常复杂的查询。

编辑:索引映射:http://pastebin.com/fuLLgHjB .目标字段尚未分析,因为:(1) 我不是进行初始设置的人,并且 (2) 我真的不确定我应该设置什么字段分析器,所以这是问题的一部分。

最佳答案

Elasticsearch 有非常好的默认设置。您应该从默认设置开始,并且仅在某些内容未按您希望的方式工作时才添加/更改设置。越简单越好。

设置映射时,字符串字段的默认设置是分析它们。这是一件好事,因为将字符串分解为标记并进行词干提取,这样您就可以进行部分匹配和模糊匹配。您不需要指定分析器; standard analyzer应该工作正常。未分析的字段意味着 Elasticsearch 不会对该字段做任何事情;这对于分面(计算“John”、“Jon”和“Jonathan”中每个人的订单数)之类的事情很有用,但对于一般的全文搜索就没那么有用了。如果您真的认为您需要该字段的未分析版本,您可以在多字段中包含已分析和未分析的同一字段;查看 multi-field docs了解更多信息。

这是一个示例映射;您甚至可能不需要生成 fullName 字段。

    "properties": {
      "firstName": { "type": "string" },
      "lastName": { "type": "string" },
      "middleName": { "type": "string" },
      "fullName": { "type": "string" }
    }

一旦您的字段被分析,查询中术语的顺序不必完全匹配,拼写不必完美等等。尝试最简单的查询,它应该工作得很好:

{
  "query": {
    "query_string": {
      "query": "John Doe",
      "fields": [
        "firstName",
        "middleName",
        "lastName"
      ]
      ]
    }
  }
}

如果它没有按照您预期的方式对结果进行排序,您可以尝试将查询字符串中的非尾随空格替换为 AND,以要求所有术语:John AND Doe

关于elasticsearch - 使用单个查询字符串和任意顺序的单词查询多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21181119/

相关文章:

elasticsearch - 结合流利的和对象初始化的语法

python - 在 Python 中解析 Elasticsearch json 输出

elasticsearch - 如何将简单的Groovy脚本转换为Lucene表达(或使用其他方法)?

elasticsearch - elasticsearch在字段上返回不正确的value_count

elasticsearch - 将汇总限制为值列表

elasticsearch - N1QL和ElasticSearch加入

elasticsearch - 无法使通配符查询在Elasticsearch中的多个字段上工作

elasticsearch - ES/Kibana 中的 _score 是什么?

php - Elasticsearch 的多项选择

elasticsearch - Elastic Search 匹配短语查询 -> 输出不可预测