这是我要实现的目标的简化示例-我确信这是很标准的事情,希望我能指出我正确的模式,方法和方法的方向,而无需重新发明轮子。
PUT /test/vendors/1
{
"type": "clinic",
"name": "ENT of Boston",
"place": "Boston"
}
PUT /test/vendors/2
{
"type": "law firm",
"name": "Ambulance Chasers Inc.",
"place": "Boston"
}
说我想支持这样的搜索:
"Ambulance Chasers"
"Law Firm in Boston"
我可以这样搜索:
GET /test/_search
{
"query": {
"multi_match" : {
"query": "Law Firm in Boston",
"fields": [ "type", "place", "name" ],
"type": "most_fields"
}
}
}
他的意思是,这也会让我ENT Of Boston
,因为它的名字叫Boston
,尽管这显然不是我想要的。
我知道我可以编写自己的代码来分析搜索字符串,然后再将其提交给Elasticsearch,并强制Boston
仅在文档的place字段中进行搜索。我可以在所有字段中执行此操作,并发出超级精确指针搜索查询,以准确了解用户的需求。但是,有没有更简单的方法来处理我所缺少的东西?
我想我要问的是,Elasticseaarch是否有一种方法可以让我微调和“理解”我要寻找的内容,而不必强迫我深入自己的代码来重新进行自然语言处理并重新发明轮子。
答案 0 :(得分:3)
Elasticsearch“搜索”纯粹基于关键字搜索。
但是您得到的是 some NLP,例如检索或收集数据,提取所需的信息,标记化,停用词删除(所有这些操作均由分析仪完成),相似度计算(使用tf-idf和向量空间模型)。
进一步的NLP流程包括提出一个模型,对该模型进行训练,对文本数据进行分类等,我认为Elasticsearch没有能够做到这一点的引擎。(有一个称为{{3}的实现},但我不确定它的工作方式(尚未阅读)。
您可以做的是,如果最终创建一个引擎,则可以使用elasticsearch作为NLP引擎的源,同样,您也不需要实现上述基本阶段。
您可以检查此MLT(More Like This),这很有趣。
不管怎么说,看看您的用例,我提出了以下查询。我知道它不是确切的解决方案,但可以提供您想要的结果。
POST <your_index_name>/_search
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "law",
"fields": [ "type", "place", "name"],
"type": "most_fields"
}
},
{
"multi_match": {
"query": "firm",
"fields": [ "type", "place", "name"],
"type": "most_fields"
}
},
{
"multi_match": {
"query": "boston",
"fields": [ "type", "place", "name"],
"type": "most_fields"
}
}
]
}
}
}
我所做的只是简单地使用您发布的查询为每个单词创建一个must子句。这样可以确保您不会最终得到想要的结果。
让我知道是否有帮助!
答案 1 :(得分:0)
这还不是很清楚,但是如果我理解得很好,则需要一个布尔查询,该查询将就地搜索值波士顿的字段与对其他两个字段的multi_search组合在一起:
.LBB1_2
答案 2 :(得分:0)
也许我可能对此进行了简化,但是您可以强制“地方”字段中的项目仅出现在诸如“ in”之类的特定单词之后。