弹性搜索中的相对单词匹配

时间:2016-02-03 14:45:54

标签: elasticsearch

Elastic搜索的新手,下面是我想要实现的,与查询字符串相对匹配的任何内容都应该返回结果

创建示例索引,如下所示

csrf_exempt

搜索时

curl -XPUT 'http://localhost:9200/prj1/mod/java' -d '{
    "project_name": "Java_SE"
}'

curl -XPUT 'http://localhost:9200/prj1/mod/java2Ed' -d '{
    "project_name": "Java 2 Edition"
}'

curl -XPUT 'http://localhost:9200/prj1/mod/javaee' -d '{
    "project_name": "Java_EE"
}'

返回结果

curl -XGET 'http://localhost:9200/prj1/mod/_search' -d '{"query" : {"match" : {"project_name" : "Java"}}}'

它不会返回名称为“Java_SE”,“Java 2 Edition”和“Java_EE”的所有项目。

需要通过匹配文本“示例”获取找到的所有内容 我也可以在我的文本中获得这样的数据

这是一个example_code 这个例子:11很好 您正在寻找的示例不可用。

我在这里做错了什么。

3 个答案:

答案 0 :(得分:2)

您需要使用edge ngram过滤器来解决此问题。使用以下设置

创建索引
PUT prj1
{
  "settings": {
    "analysis": {
      "filter": {
        "ngram_filter": {
          "type": "edgeNGram",
          "min_gram": 2,
          "max_gram": 8
        }
      },
      "analyzer": {
        "relative": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "ngram_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "mod": {
      "properties": {
        "project_name": {
          "type": "string",
          "analyzer": "relative",
          "search_analyzer": "standard"
        }
      }
    }
  }
}

所以 java_se 会有令牌 ja jav java 等,你的match query会有效

感谢@sean,您需要将ngram filter用于 complete_java_book my_java_applet 等字词。您可能需要考虑打破{{ 1}}如果您使用_作为项目名称的命名约定,是吗?

希望这有帮助。

答案 1 :(得分:0)

这是因为,默认情况下,elasticsearch将使用standard tokenizer,它不会在下划线上分割文字" _"字符。因此,当您执行搜索时,您正在搜索" java"只有文档java2ED具有令牌的令牌。

答案 2 :(得分:0)

您也可以使用query_string

curl -XGET 'http://localhost:9200/prj1/mod/_search' -d '{"query" : {"query_string" : {"project_name" : "*Java*"}}}'