代码之家  ›  专栏  ›  技术社区  ›  Jeff

弹性搜索多标记关键字同义词

  •  0
  • Jeff  · 技术社区  · 10 年前

    我试图在Elasticsearch中实现简单的多令牌同义词,但没有得到我期望的结果。这里有一些卷曲:

    curl -XPOST "http://localhost:9200/test" -d'
    {
      "mappings": {
        "my_type": {
          "properties": {
            "blah": {
              "type": "string",
              "analyzer": "my_synonyms"
            }
          }
        }
      },
      "settings": {
        "index": {
          "analysis": {
            "filter": {
              "my_syn_filt": {
                "type": "synonym",
                "synonyms": [
                  "foo bar, fooo bar"
                ]
              }
            },
            "analyzer": {
              "my_synonyms": {
                "filter": [
                  "lowercase",
                  "my_syn_filt"
                ],
                "tokenizer": "keyword"
              }
            }
          }
        }
      }
    }'
    

    为一些文档编制索引:

    curl -XPUT localhost:9200/test/my_type/1 -d '{"blah": "fooo bar"}'
    curl -XPUT localhost:9200/test/my_type/2 -d '{"blah": "fooo barr"}'
    curl -XPUT localhost:9200/test/my_type/3 -d '{"blah": "foo bar"}'
    

    现在查询:

    curl -XPOST "http://localhost:9200/test/_search" -d'
    {
      "query": {
        "match": {
          "blah": "foo bar"
        }
      }
    }'
    

    我希望能拿回文件1和3,但只能拿回3。有人知道问题可能是什么吗?

    进一步检查后,当直接调用分析器时,我也没有得到预期的令牌:

    curl 'localhost:9200/test/_analyze?analyzer=my_synonyms' -d 'fooo bar'
    

    当我需要两个标记:“fooo-bar”和“foo-bar”时,只返回一个标记“fooo-bar”。

    1 回复  |  直到 10 年前
        1
  •  2
  •   coffeeaddict    10 年前

    看起来,如果您搜索“fooo bar”,就会得到文档1和3。要获得您期望的结果,您必须翻转同义词以达到相反的效果:

    “fooo bar=>foo bar”

    箭头告诉ES在右侧添加术语,作为左侧所有术语的同义词。如果您希望它们是双向的,您可以简单地执行“fooo-bar,foo-bar”,并确保expand未显式设置为false。