Elasticserach结合edge-nGram与同义词分析器

时间:2017-05-25 09:55:59

标签: post elasticsearch autocomplete

我正在开发基于ElasticSearch的自动完成搜索微服务。目的是防止重复输入。因此,服务应该抵制拼写错误和拼写错误,这是我想用edge-nGram过滤器实现的。到目前为止它的工作效果非常好而且效率很高 现在,下一个任务是识别同义词。我配置了同义词过滤器,这也很好。

但我想把这两者结合起来。该服务应首先找到拼写错误,然后找到更正形式的同义词。 示例:用户输入德语单词“Prufung”(正确拼写为“Prüfung”,表示英语考试)。现在我的服务将所有文件与“Prüfung”匹配,但它也应该匹配所有文件与“Prüfung”的同义词,更正(在文件中找到的单词)形式,例如“test”或“Klassenarbeit”以及dict中所有其他已定义的同义词。

是否可以按上述方式连接两个分析仪?目前,两者都在使用multi_match和字段,但不是“一起工作”。

感谢您的帮助。

编辑: 这是我的(测试)索引:

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonym_filter": {
          "type": "synonym",
          "synonyms_path": "synonyms/german_synonyms.txt"
        },
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 15
        }
      },
      "analyzer": {
        "my_synonyms": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "my_synonym_filter"
          ]
        },
        "autocomplete": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    }
  }
}

使用这些映射:

PUT /my_index/_mapping/test
{
  "test": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "standard",
        "fields": {
          "ngram": {
            "type": "text",
            "analyzer": "autocomplete",
            "search_analyzer": "standard",
            "boost": 1
          },
          "synonym": {
            "type": "text",
            "analyzer": "standard",
            "search_analyzer": "my_synonyms",
            "boost": 0.5
          }
        }
      }
    }
  }
}

现在我输入一些数据:

POST /my_index/test
{
  "name": "Prüfung"
}

1)用拼写错误搜索:

GET /my_index/test/_search
{
  "query": {
    "multi_match": {
      "query": "Prufung", 
      "fields": [
        "name.ngram",
        "name.synonym"],
      "fuzziness": "AUTO"
    }
  }
}

(u而不是ü)结果:

{
  "took": 26,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.67509395,
    "hits": [
      {
        "_index": "my_index",
        "_type": "test",
        "_id": "AVxFrd_M_ZFx6PmfIobY",
        "_score": 0.67509395,
        "_source": {
          "name": "prüfung"
        }
      }
    ]
  }
}

2)搜索“test”而不是prüfung(同义词)会得到与上面相同的结果。

我想要的是:

搜索tesd(用拼写错误搜索)但它应该与Prüfung(正确的拼写测试的同义词)相匹配。

0 个答案:

没有答案