我遇到了搜索错误 - 需要一些帮助。我有文章索引与id,标题,艺术家,流派领域。当我运行此查询时,我得到零结果 -
POST / d3acampaign / article / _search
{
"query": {
"filtered": {
"query": {
"match": {"genre": "metal"}
},
"filter": {
"term": {"id": "7"}
}
}
}
}
但如果我将查询更改为类似的内容 - POST / d3acampaign / article / _search
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1.4054651,
"hits": [
{
"_index": "d3acampaign",
"_type": "article",
"_id": "7",
"_score": 1.4054651,
"_source": {
"id": "7",
"title": "The Last Airbender",
"artist": "Somanath",
"genre": "metal"
}
}
]
}
}
我得到以下结果 -
long myId // Primary key/id of row to be updated
DomainObject obj = gson.fromJson(jsonString, DomainObject.class)
obj.id=myId
obj.save(flush:true)
澄清 - 如果我尝试反对字符串,我注意到搜索失败,例如艺术家,标题
答案 0 :(得分:0)
您获得空点击的原因是,当您使用term query
进行查询时,它将与索引中的 确切术语 匹配 大写 强>
并且默认分析器将使用小写创建索引。
分析文本的方法有很多种:默认的标准分析器 删除大多数标点符号,将文本分解为单个单词,以及 小例子。 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
解决方案:
{
"query": {
"filtered": {
"query": {
"match": {"genre": "metal"}
},
"filter": {
"term": {"artist": "somanath"} //to lower case
}
}
}
}
另一种解决方案是将 索引映射 更改为 not_analyzed 作为索引类型。
完整的例子:
#!/bin/bash
curl -XDELETE "localhost:9200/testindex"
curl -XPUT "localhost:9200/testindex/?pretty" -d '
{
"mappings":{
"test":{
"properties":{
"name":{
"index":"not_analyzed",
"type":"string"
}
}
}
}
}'
curl -XGET "localhost:9200/testindex/_mapping?pretty"
curl -XPOST "localhost:9200/testindex/test/1" -d '{
"name": "Jack"
}'
sleep 1
echo -e
echo -e
echo -e
echo -e "Filtered Query Search in not_analyzed index:"
echo -e
curl -XGET "localhost:9200/testindex/test/_search?pretty" -d '{
"query": {
"filtered": {
"filter": {
"term": {"name": "Jack"}
}
}
}
}'