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很好 您正在寻找的示例不可用。
我在这里做错了什么。
答案 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*"}}}'