这是Elastic搜索的新手,下面是我试图实现的目标,即任何与查询字符串相对匹配的内容都应该返回结果
如下所示创建示例索引
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"}}}'返回结果下方
{"took":6,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.15342641,"hits":[{"_index":"prj1","_type":"mod","_id":"java2Ed","_score":0.15342641,"_source":{
"project_name": "Java 2 Edition"
}}]}}它不会返回名称为"Java_SE“、”Java2Edition“和"Java_EE”的所有项目。
我需要得到它找到的一切与匹配文本“示例”我可以有这样的数据在我的文本以及
这是一个example_code这个例子:11是一个很好的例子你正在寻找的例子是不可用的。
我在这里做错了什么。
发布于 2016-02-03 23:13:10
您需要使用edge ngram filter来解决此问题。使用以下设置创建索引
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等单词。如果你使用_作为项目名称的命名约定,你可能会考虑打破_中的单词,不是吗?
希望这能有所帮助。
发布于 2016-02-03 22:57:14
这是因为,默认情况下,elasticsearch将使用standard tokenizer,它不会拆分下划线"_“字符上的文本。因此,当您执行搜索时,您搜索的是只有文档java2ED具有标记的"java“标记。
发布于 2016-02-04 01:25:52
您也可以使用query_string。
curl -XGET 'http://localhost:9200/prj1/mod/_search' -d '{"query" : {"query_string" : {"project_name" : "*Java*"}}}'https://stackoverflow.com/questions/35180108
复制相似问题