我使用的是Elasticsearch,没有任何修改。这意味着映射,规范和analyze / not_analyzed都是默认配置。我有一个非常小的数据集,包含两个项目用于实验目的。这些项目有几个字段,但我只查询一个字段,这是一个多值/字符串数组字段。该文档看起来像这样:
{
"_index": "index_profile",
"_type": "items",
"_id": "ega",
"_version": 1,
"found": true,
"_source": {
"clicked": [
"ega"
],
"profile_topics": [
"Twitter",
"Entertainment",
"ESPN",
"Comedy",
"University of Rhode Island",
"Humor",
"Basketball",
"Sports",
"Movies",
"SnapChat",
"Celebrities",
"Rite Aid",
"Education",
"Television",
"Country Music",
"Seattle",
"Beer",
"Hip Hop",
"Actors",
"David Cameron",
... // other topics
],
"id": "ega"
}
}
示例查询是:
GET /index_profile/items/_search
{
"size": 10,
"query": {
"bool": {
"should": [{
"terms": {
"profile_topics": [
"Basketball"
]
}
}]
}
}
}
同样只有两个项目,列出的项目应与查询匹配,因为profile_topics
字段与" Basketball"匹配术语。其他项目不匹配。如果我在the should中要求clicked
= ega
,我只会得到一个结果。
使用Solr我可能会指定字段是多值字符串数组,并且没有规范,也没有分析器,因此profile_topics不会被阻塞或标记化,因为所有值都应该被视为标记(甚至是空格)。不确定这会解决问题,但这是我如何处理Solr上的类似数据。
我认为我已经违反了一些规范/分析器/ TF-IDF问题,如果是这样,我如何解决这个问题,即使有两个项目,查询也会返回ega
。如果可能的话,我想解决这个索引或者输入广泛而不是字段特定的。
答案 0 :(得分:0)
Basketball
中的{p> B
(资金terms
)。这意味着这是在Elasticsearch索引中搜索它的方式。
你说你有默认值。如果是,则在Basketball
字段下编制profile_topics
索引意味着索引中的实际字词将为basketball
(小写b
),这是{{1}的结果分析器。因此,要么将standard
设置为profile_topics
,要么搜索not_analyzed
而不是basketball
。
关于Basketball
,请阅读this。
关于将所有字段设置为terms
,您可以使用动态模板执行此操作。仍然使用模板,您可以执行Logstash正在执行的操作:为每个not_analyzed
字段定义.raw
子字段,并且只有此子字段为string
。原始/父字段仍然保存相同文本的分析版本,也许您将来会使用分析字段。
看看这个dynamic template。这是Logstash正在使用的那个。
更具体地说:
not_analyzed