Поиск по ключевым словам И фильтрация в Elasticsearch - PullRequest
1 голос
/ 28 сентября 2019

Я должен искать ключевые слова в одном поле и точное совпадение в другом поле.Я пытался что-то, но это, похоже, не работает вообще.

Я пытался дать полную статью с автором, как я положил в 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, она все равно не даст никаких результатов.

1 Ответ

1 голос
/ 28 сентября 2019

Попробуйте вот так

Отображения

{
  "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.По умолчаниюasticsearch создаст сопоставление ключевых слов для текстовых полей.

Примечание: Вы можете попробовать эти вещи, используя Kibana UI , предоставленный командой эластичных команд.Это сэкономит много времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...