【问题标题】:Keyword searching AND Filtering in ElasticsearchElasticsearch 中的关键字搜索和过滤
【发布时间】:2020-01-28 10:41:04
【问题描述】:

我必须在一个字段中搜索关键字并在另一个字段中搜索完全匹配。我尝试了一些东西,但它似乎根本不起作用。

我尝试在 AWS ElasticSearch 中与作者一起提供完整文章,但它仍然无法检索任何内容。

query=json.dumps({
    "query": {
        "bool": {
            "must": {
                "match": {
                    "article": "man killed kim jones"
                }
            },
            "filter": {
                "term": {
                    "author": "Barbara Boyer"                        
                }
            }
        }
    }
})
response = requests.get(url-ES-domain/data/_search?",headers=headers,data=(query))
response.json()  

映射细节

{
"mappings": {
    "article": {
      "full_name": "article",
      "mapping": {
        "article": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

这是针对文章中的关键字的。即使我在 ES 索引中给出完整的文章,它仍然不会得到任何点击。

【问题讨论】:

  • 也许是小写?文章可能是“人杀了金琼斯”或类似的变体?
  • 可以添加映射和文档数据吗
  • 你在 kibana 查询上试过了吗?
  • @powerPixie 这篇文章包含我手动输入的这些确切的单词。
  • @jaspreetchahal 我刚刚学习了映射;只是弹性搜索的初学者,所以尝试不同的东西。映射为:` ` ` {"data":{"mappings":{"article":{"full_name":"article","mapping":{"article":{"type":"text"," fields":{"keyword":{"type":"keyword","ignore_above":256}}}}}}}} ` ` ` @AlwaysSunny 不,我现在对 Kibana 没有任何用处

标签: python python-3.x amazon-web-services elasticsearch


【解决方案1】:

这样试试

映射

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 20,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      },
      "normalizer": {
        "lc_normalizer": {
          "type": "custom",
          "filter": ["lowercase"]
        }
      }
    },
    "max_ngram_diff": 20
  },
  "mappings": {
    "properties": {
      "article": {
        "type": "text",
        "analyzer": "my_analyzer", 
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "author": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256,
            "normalizer": "lc_normalizer"
          }
        }
      },
      "key": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "publication": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "title": {
        "type": "text",
        "analyzer": "my_analyzer", 
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

查询

{
 "query": {
    "bool": {  
      "must" : {
        "multi_match" : {
          "query": "man killed kim jones",
          "fields":     [ "article", "title" ]
        }
      },
      "filter": {
        "term": {
          "author.keyword": "Maddie Hanna"
        }
      }
    }
  }
}

上述查询返回匹配项,并返回您已添加到文档中的文档。

当您搜索多词匹配时,我建议您使用match_phrase 查询。默认情况下,elasticsearch 会为文本字段创建关键字映射。

注意:您可以使用弹性团队提供的Kibana UI 尝试这些事情。这样会节省很多时间。

【讨论】:

  • 谢谢!这工作得很好!下次我一定会牢记映射和正确的查询结构。
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多