【问题标题】:Elasticsearch matching string with like operatorElasticsearch匹配字符串与like运算符
【发布时间】:2017-12-19 13:06:27
【问题描述】:

我会查询 elasticsearch 以检索具有给定字符串等字段值的所有文档。

例如field LIKE "abc"必须返回

  • “abc”
  • “abcdef”
  • “abcd”
  • “abc1”

所以所有包含"abc" 字符串的字段。

我尝试这个查询,但只返回带有field = "abc"的文档:

{"query":{"more_like_this":{"fields":["FIELD"],"like_text":"abc","min_term_freq" : 1,"max_query_terms" : 12}}}

什么是正确的查询?

谢谢

【问题讨论】:

    标签: java elasticsearch elasticsearch-query


    【解决方案1】:

    如果您尝试进行前缀查询,那么您可以使用它。

    { "query": {
      "prefix" : { "field" : "abc" }
    }
    

    查看 ElasticSearch 前缀查询ElasticSearch Prefix Query

    【讨论】:

      【解决方案2】:

      虽然你的问题不完整。我会尝试给你一些想法。

      一种方法肯定是前缀查询,但更有效的是构建边缘 ngram 分析器。这样您就可以在插入时准备好数据,并且查询会更快。 edge ngram 也是实现功能的最灵活方式,因为您可以自动完成以任何顺序出现的单词。如果您不需要这样做,但您只需要“键入时搜索”查询,那么最好的方法是使用完成建议。如果您需要查找出现在单词中间的字符串,则可以检查 ngram 分析器。

      以下是我如何从我的代码中设置边缘 ngram 分析器。

              "settings": {
                  "analysis": {
                      "filter"  : {
                          "edge_filter"        : {
                              "type"    : "edge_ngram",
                              "min_gram": 1,
                              "max_gram": 256
                          }
                      },
                      "analyzer": {
                          "edge_analyzer" : {
                              "type"     : "custom",
                              "tokenizer": "whitespace",
                              "filter"   : ["lowercase", "edge_filter"]
                          },
                          "lowercase_whitespace": {
                              "type": "custom",
                              "tokenizer": "whitespace",
                              "filter": [ "lowercase" ]
                          }
                      }
                  }
              },
              "mappings": {
                  "my_type": {
                      "properties": {
                          "name": {
                              "type": "keyword",
                              "fields": {
                                  "suggest": {
                                      "type": "text",
                                      "analyzer" : "edge_analyzer",
                                      "search_analyzer": "lowercase_whitespace"
                                  }
                              }
                          }
                      }
                  }
              }
      

      【讨论】:

        【解决方案3】:

        您应该能够执行此处所述的通配符查询。

        Elasticsearch like query

        {
          "query": {
            "wildcard": {
              "<<FIELD NAME>>": "*<<QUERY TEXT>>*"
            }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-05
          • 1970-01-01
          • 2012-10-20
          • 2011-01-23
          • 2018-08-03
          • 1970-01-01
          • 2017-08-22
          • 2014-06-08
          相关资源
          最近更新 更多