当前位置: 首页 > 面试题库 >

如何在elasticsearch中配置同义词_路径

费星晖
2023-03-14
问题内容

我是Elasticsearch的新手,我想使用同义词,我在配置文件中添加了以下几行:

index :
    analysis :
        analyzer : 
            synonym :
                type : custom
                tokenizer : whitespace
                filter : [synonym]
        filter :
            synonym :
                type : synonym
                synonyms_path: synonyms.txt

然后我创建了一个索引测试:

"mappings" : {
  "test" : {
     "properties" : {
        "text_1" : {
           "type" : "string",
           "analyzer" : "synonym"
        },
        "text_2" : {
           "search_analyzer" : "standard",
           "index_analyzer" : "synonym",
           "type" : "string"
        },
        "text_3" : {
           "type" : "string",
           "analyzer" : "synonym"
        }
     }
  }

}

并使用以下数据插入类型测试:

{
"text_3" : "foo dog cat",
"text_2" : "foo dog cat",
"text_1" : "foo dog cat"
}

onymousy.txt包含“ foo,bar,baz”,当我搜索foo时,它返回我期望的结果,但是当我搜索baz或bar时,它返回零结果:

{
"query":{
"query_string":{
    "query" : "bar",
    "fields" : [ "text_1"],
    "use_dis_max" : true,
    "boost" : 1.0
}}}

结果:

{
"took":1,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"failed":0
},
"hits":{
"total":0,
"max_score":null,
"hits":[
]
}
}

问题答案:

我不知道,如果您的问题是因为您为“
bar”定义了错误的同义词。正如您所说的,您是一个非常新的人,我将举一个与您的例子相似的例子。我想展示一下Elasticsearch在搜索时和索引时如何处理同义词。希望能帮助到你。

首先,创建同义词文件:

foo => foo bar, baz

现在,我使用您要测试的特定设置创建索引:

curl -XPUT 'http://localhost:9200/test/' -d '{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "whitespace",
            "filter": ["synonym"]
          }
        },
        "filter" : {
          "synonym" : {
              "type" : "synonym",
              "synonyms_path" : "synonyms.txt"
          }
        }
      }
    }
  },
  "mappings": {

    "test" : {
      "properties" : {
        "text_1" : {
           "type" : "string",
           "analyzer" : "synonym"
        },
        "text_2" : {
           "search_analyzer" : "standard",
           "index_analyzer" : "standard",
           "type" : "string"
        },
        "text_3" : {
           "type" : "string",
           "search_analyzer" : "synonym",
           "index_analyzer" : "standard"
        }
      }
    }
  }
}'

请注意,onymous.txt必须与配置文件位于同一目录中,因为该路径相对于config目录。

现在为文档编制索引:

curl -XPUT 'http://localhost:9200/test/test/1' -d '{
  "text_3": "baz dog cat",
  "text_2": "foo dog cat",
  "text_1": "foo dog cat"
}'

现在搜索

在字段text_1中搜索

curl -XGET 'http://localhost:9200/test/_search?q=text_1:baz'
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.15342641,
    "hits": [
      {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 0.15342641,
        "_source": {
          "text_3": "baz dog cat",
          "text_2": "foo dog cat",
          "text_1": "foo dog cat"
        }
      }
    ]
  }
}

您得到该文档,因为baz是foo的同义词,并且在索引时间foo用其同义词扩展

在字段text_2中搜索

curl -XGET 'http://localhost:9200/test/_search?q=text_2:baz'

结果:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

我没有获得成功,因为我在索引(标准分析器)时没有扩展同义词。而且,由于我正在搜索baz,并且baz不在文本中,所以没有任何结果。

在字段text_3中搜索

curl -XGET 'http://localhost:9200/test/_search?q=text_3:foo'
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.15342641,
    "hits": [
      {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 0.15342641,
        "_source": {
          "text_3": "baz dog cat",
          "text_2": "foo dog cat",
          "text_1": "foo dog cat"
        }
      }
    ]
  }
}

注意:text_3是“巴兹狗猫”

text_3是没有扩展同义词的索引。当我搜索foo时,它的同义词之一是“ baz”,我得到了结果。

如果要调试,可以使用_analyze端点,例如:

curl -XGET 'http://localhost:9200/test/_analyze?text=foo&analyzer=synonym&pretty=true'

结果:

{
  "tokens": [
    {
      "token": "foo",
      "start_offset": 0,
      "end_offset": 3,
      "type": "SYNONYM",
      "position": 1
    },
    {
      "token": "baz",
      "start_offset": 0,
      "end_offset": 3,
      "type": "SYNONYM",
      "position": 1
    },
    {
      "token": "bar",
      "start_offset": 0,
      "end_offset": 3,
      "type": "SYNONYM",
      "position": 2
    }
  ]
}


 类似资料:
  • 问题内容: 是否可以在索引中存储elasticsearch的同义词?还是可以从像ouchdb这样的数据库中获取同义词列表?我想通过REST- API将同义词动态添加到elasticsearch。 问题答案: 使用同义词有两种方法: 在编制索引时扩展它们, 在查询时扩展它们。 不建议在查询时扩展同义词,因为它会引起以下问题: 评分,因为同义词具有不同的文档频率, 多令牌同义词,因为查询解析器在空白处

  • 问题内容: 我正在使用elasticsearch 1.1.2。 我在可搜索字段上使用具有不同权重的多重匹配查询。 例: {“ multi_match”:{“ query”:“这是一个测试”,“ fields”:[“ title ^ 3”,“ description ^ 2”,“ body”]}} 因此,在我的示例中,标题的重要性是正文的三倍。 我想根据找到的匹配项为每个字段自定义权重。 假设我搜索

  • 问题内容: 根据elasticsearch参考文档,可以: 可以在索引时间或查询时间应用扩展。每个都有优点(⬆)︎和缺点(⬇)︎。何时使用取决于性能与灵活性。 优点和缺点都是有意义的,对于我的特定用途,我想 在查询时 使用同义词。我的用例是,我希望允许系统中的管理员用户管理这些同义词,而不必在更新时重新索引所有内容。另外,我想不关闭并重新打开索引就这样做。 我认为这是可能的主要原因是此优势: (⬆

  • null 我希望使用标准的方法和spring的能力来自动配置bean,我不希望手动加载一些属性文件和手动配置所有bean。因此,为了解决这个问题,我创建了另一个配置应用程序--Customization.yml,并通过include将其链接到prod config中(参见上面的示例)。在这里我遇到了一个问题:我无法通过命令行参数(-dspring.config.location或任何it变体)选择

  • 我有一个build.gradle文件,比如: 当我使用STS Gradle插件将项目导入Eclipse时,只有compile conf依赖项显示在“Gradle dependencies”类路径容器下。 是否也有可能让提供的conf被STS插件拉入?

  • 问题内容: 编辑:要补充一点,同义词似乎可以与基本的查询字符串查询一起使用。 这将返回新罕布什尔州的所有结果,但对“ nh”的“匹配”查询将不返回结果。 我正在尝试将同义词添加到我的Elastic索引中的位置字段中,这样,如果我对“质量”,“马”或“马萨诸塞州”进行位置搜索,则每次都会得到相同的结果。我将同义词过滤器添加到设置中,并更改了位置映射。这是我的设置: 以及location.region