Elasticsearch匹配字符串与like运算符

时间:2017-12-19 13:06:28

标签: java elasticsearch elasticsearch-query

我会查询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}}}

什么是正确的查询?

由于

3 个答案:

答案 0 :(得分:0)

如果您正在尝试执行前缀查询,则可以使用此功能。

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

请参阅ElasticSearch前缀查询ElasticSearch Prefix Query

答案 1 :(得分:0)

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

一种方法肯定是前缀查询,但更有效的是构建边缘ngram分析器。这样,您可以在插入和查询上准备好数据,速度会快得多。 edge ngram也是最灵活的功能,因为您可以自动填充以任何顺序出现的单词。如果您不需要这样做,但您只需要在键入时搜索"查询然后最好的方法是使用完成建议器。如果你需要找到出现在单词中间的字符串,那么你可以查看ngram analyzer。

以下是我如何从代码中设置边缘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"
                            }
                        }
                    }
                }
            }
        }

答案 2 :(得分:-1)

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

Elasticsearch like query

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