java - 使用 elasticsearch 对文本进行分类

标签 java search elasticsearch

我目前正在从事一个项目,该项目涉及从文本中识别不同的“关键词”。

例如,假设输入文本如下:

"This is an example of some text written from Buenos Aires about Meat".

进一步假设我的 elasticsearch 实例存储了以下文档:

Cities: [Barcelona, Buenos Aires, Los Angeles, ...]

Categories: [finance, politics, ..]

我需要一种方法来从输入文本中识别相应的城市和类别。

我的第一种方法是使用“或”运算符进行搜索查询,然后查看哪个排名最高。之后,我还将匹配的文档与文本重新匹配,以确保这些文本确实存在(换句话说,确保“洛杉矶”匹配,因为“洛杉矶”一词在文本中并且只有“los”或“天使”。

我想知道这是否是使用 Elasticsearch 执行此类操作的最佳实践方式。

最佳答案

我建议如下:

  • 使用match_phrase查询以识别术语 losangeles 存在并且以相同的顺序和位置存在
  • 将每个查询包装在 named filter 中这样您就可以确定哪些匹配。

例如,创建这个文档:

curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1'  -d '
{
   "text" : "This is an example of some text written from Buenos Aires about Meat"
}
'

然后运行此查询以查找 Buenos AiresLos Angeles:

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1'  -d '
{
   "query" : {
      "constant_score" : {
         "filter" : {
            "or" : [
               {
                  "fquery" : {
                     "_name" : "buenos_aires",
                     "query" : {
                        "match_phrase" : {
                           "text" : "Buenos Aires"
                        }
                     }
                  }
               },
               {
                  "fquery" : {
                     "_name" : "los_angeles",
                     "query" : {
                        "match_phrase" : {
                           "text" : "Los Angeles"
                        }
                     }
                  }
               }
            ]
         }
      }
   }
}
'

# {
#    "hits" : {
#       "hits" : [
#          {
#             "_source" : {
#                "text" : "This is an example of some text written from Buenos Aires about Meat"
#             },
#             "_score" : 1,
#             "_index" : "test",
#             "_id" : "JIwnN_FVTv-0i5YGrlHLeg",
#             "_type" : "test",
#             "matched_filters" : [
#                "buenos_aires"
#             ]
#          }
#       ],
#       "max_score" : 1,
#       "total" : 1
#    },
#    "timed_out" : false,
#    "_shards" : {
#       "failed" : 0,
#       "successful" : 5,
#       "total" : 5
#    },
#    "took" : 58
# }

注意结果中的 matched_filters 元素,指示哪个过滤器匹配。

关于java - 使用 elasticsearch 对文本进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15062897/

相关文章:

java - SQL/HQL查询: find object that has a list of objects that matchs some parameters

c# - 在关联角色的文档中搜索

java - Lucene 5 排序问题(UninvertedReader 和 DocValues)

elasticsearch - Elasticsearch嵌套查询匹配和/或

java - 如何判断当前 tx (Hibernate) 中是否删除了 Grails/GORM 域实例?

java - 在 Java 中使用 Date 为用户设置随机日期?

java - 如何调试 HTTP 错误 503 - Jetty

c++ - 检查目录树中的任何文件是否已更改的最快方法是什么?

elasticsearch - 如何在Elasticsearch中对多值字段进行桶聚合

java - 如何检查 ElasticSearch 的恢复是否完成?