【问题标题】:Elastic Search only matches full field弹性搜索仅匹配完整字段
【发布时间】:2018-08-05 21:27:42
【问题描述】:

我刚刚开始在 AWS 上使用 Elastic Search 6。

我已将数据插入到我的 ES 端点,但我只能使用完整的句子搜索它,而不能匹配单个单词。在过去,我似乎会使用 not_analyzed,但这已被“关键字”取代。但是这仍然不起作用。

这是我的索引:

{
  "seven" : {
    "aliases" : { },
    "mappings" : {
      "myobjects" : {
        "properties" : {
          "id" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "myId" : {
            "type" : "text"
          },
          "myUrl" : {
            "type" : "text"
          },
          "myName" : {
            "type" : "keyword"
          },
          "myText" : {
            "type" : "keyword"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "number_of_shards" : "5",
        "provided_name" : "seven",
        "creation_date" : "1519389595593",
        "analysis" : {
          "filter" : {
            "nGram_filter" : {
              "token_chars" : [
                "letter",
                "digit",
                "punctuation",
                "symbol"
              ],
              "min_gram" : "2",
              "type" : "nGram",
              "max_gram" : "20"
            }
          },
          "analyzer" : {
            "nGram_analyzer" : {
              "filter" : [
                "lowercase",
                "asciifolding",
                "nGram_filter"
              ],
              "type" : "custom",
              "tokenizer" : "whitespace"
            },
            "whitespace_analyzer" : {
              "filter" : [
                "lowercase",
                "asciifolding"
              ],
              "type" : "custom",
              "tokenizer" : "whitespace"
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "_vNXSADUTUaspBUu6zdh-g",
        "version" : {
          "created" : "6000199"
        }
      }
    }
  }
}

我有这样的数据:

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 13,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "seven",
        "_type" : "myobjects",
        "_id" : "8",
        "_score" : 1.0,
        "_source" : {
          "myUrl" : "https://myobjects.com/wales.gif",
          "myText" : "Objects for Welsh Things",
          "myName" : "Wales"
        }
      },
      {
        "_index" : "seven",
        "_type" : "myobjects",
        "_id" : "5",
        "_score" : 1.0,
        "_source" : {
          "myUrl" : "https://myobjects.com/flowers.gif",
          "myText" : "Objects for Flowery Things",
          "myNoun" : "Flowers"
        }
      }
     ]
  }
}

如果我随后搜索“对象”,我将一无所获。如果我搜索 'Objects for Flowery Things',我会得到一个结果。

我正在使用它来搜索项目: POST /seven/objects/_search?pretty

{
    "query": {
            "multi_match" : { "query" : q, "fields": ["myText", "myNoun"], "fuzziness":"AUTO" }  
        }
    }

谁能告诉我如何让搜索匹配句子中的任何单词,而不必将整个句子放在查询中?

【问题讨论】:

  • 您必须更好地阅读关键字和文本数据类型之间的区别。这种行为是正确的
  • 我认为你搞混了。要在不输入完整句子/文本的情况下进行搜索,您不应使用 not_analyzed / 关键字。在这种情况下,将关键字更改为文本

标签: amazon-web-services elasticsearch search


【解决方案1】:

这是因为您的 myName 和 myText 字段属于 keyword 类型:

...
"myName" : {
  "type" : "keyword"
},
"myText" : {
  "type" : "keyword"
}
...

因此,它们不会被分析,只有完全匹配才会对它们起作用。将类型更改为text,它应该可以按预期工作:

...
"myName" : {
  "type" : "text"
},
"myText" : {
  "type" : "text"
}
...

【讨论】:

  • 好的,有道理。我需要创建新索引还是可以更改现有索引?
  • 我认为较短的选择是再次创建索引并再次索引文档。您也可以更改现有映射,但您可能需要再次索引现有文档,因为更改仅适用于新文档。所以效果会差不多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2016-11-25
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
相关资源
最近更新 更多