我找不到一个更好的标题,我希望稍后如果可能的话在你的最终消遣中改变它.
我的问题:
我有一个音乐艺术家的数据库.这些看起来像这样:"dr.dre feat.ano","eminem&dr.dre","dr.dre feat.ll cool j","dr.dre","dr.dre feat.eminem&skylar grey" .我们只有两个字段:id和name.
在默认模式solr核心上,我运行此查询:"q = dr.dre",结果还可以,但不完美,如下所示:
请注意,他们得到了完全相同的分数.
我想要的是将"dr.dre"作为第一个结果,然后是所有其他结果,如下所示:
我该如何实现这一目标?(过滤器,标记器,复制字段等等并不重要.我无法更改solr中的代码,因为我在其他论坛上看到过建议)
谢谢.
我正在浏览网页寻找索引和搜索框架,并偶然发现索尔.我们绝对需要的功能是根据命中包含的字段来提升结果.
一个小例子:
考虑这样的记录:
<movie>
<title>The Dark Knight</title>
<alternative_title>Batman Begins 2</alternative_title>
<year>2008</year>
<director>Christopher Nolan</director>
<plot>Batman, Gordon and Harvey Dent are forced to deal with the chaos unleashed by an anarchist mastermind known only as the Joker, as it drives each of them to their limits.</plot>
</movie>
Run Code Online (Sandbox Code Playgroud)
我想例如结合title
,alternative_title
和plot
领域进入一个搜索领域,这是不看的Solr/Lucene的文档和教程后,太难了.
然而,我也希望那些受欢迎的电影获得的title
分数高于击中的分数,alternative_title
而那些依次命中的分数应高于该plot
领域的命中率.
有没有办法在XML中表明这种评分,还是我们需要开发一些自定义评分算法?
还请注意,我给出的示例是虚构的,真实数据可能包含100多个字段.
我有一个查询(很好的一部分 - 休息是不重要的像分页):
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"term": {
"is_active": true
}
}
],
"should": [
{
"bool": {
"must": [
{
"nested": {
"path": "skills",
"query": {
"bool": {
"must": [
{
"bool": {
"must": [
{
"range": {
"skills.value": {
"gte": "2"
}
}
},
{
"term": {
"skills.skill.name": "php"
}
}
]
}
}
]
}
}
}
}
],
"boost": 2
}
}
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是用于搜索配置文件,其具有值为2或更高的技能"PHP".用户可以搜索多个技能=>值对.它工作正常,但我有一个问题: …
我在Django Haystack 1.2.5中遇到了一些问题.我需要提升一个领域,但显然它不起作用.我正在使用Solr 1.4.1.
我的索引:
class JobsTextIndex(indexes.SearchIndex):
text = indexes.CharField(document=True, use_template=True)
job_title = indexes.CharField(model_attr='job_title', boost=1.50)
job_description = indexes.CharField(model_attr='job_description')
country_ad = indexes.CharField(model_attr='country_ad')
zone_ad = indexes.CharField(model_attr='zone_ad', faceted=True)
location_ad = indexes.CharField(model_attr='location_ad', faceted=True)
date_inserted = indexes.DateTimeField(model_attr='date_inserted')
def index_queryset(self):
"""Used when the entire index for model is updated."""
return JobsadsText.objects.filter(date_inserted__lte=datetime.datetime.now())
Run Code Online (Sandbox Code Playgroud)
我在job_title"boost = 1.50",但这显然不起作用,这是Solr生成的:
INFO: [core0] webapp=/solr path=/select/ params={facet=on&sort=date_inserted+desc&fl=*+score&start=0&q=arquiteto&facet.field=location_ad_exact&facet.field=zone_ad_exact&wt=json&fq=django_ct:(myapp.jobstext)&rows=20} hits=65 status=0 QTime=5
Run Code Online (Sandbox Code Playgroud)
我正在做的查询是这样的:
sqs = SearchQuerySet().facet('zone_ad').facet('location_ad').order_by('-date_inserted')
Run Code Online (Sandbox Code Playgroud)
有人能给我一些线索,让我了解Haystack Boost的工作需求吗?
最好的祝福,
更新1:我需要更加重视"job_title"字段.例如,如果我正在搜索"程序员"这个词,我首先需要显示在"job_title"字段中按"日期"排序的"程序员"的结果,然后是"程序员"字样的结果. "job_description"字段.干草堆增压是实现这一目标的正确工具吗?
我希望我的搜索结果按照他们正在进行的分数排序,但分数计算不正确.这就是说,不一定是不正确的,但与预期不同,我不知道为什么.我的目标是删除任何改变分数的内容.
如果我执行匹配两个对象的搜索(其中ObjectA的分数高于ObjectB),则首先返回ObjectB.
让我们说,对于这个例子,我的查询是一个单词:"apples".
ObjectA的标题:"苹果是苹果"(2/3条款)
ObjectA的描述:"苹果 - 苹果中有苹果,现在苹果遍布苹果的所有苹果!" (6/18条款)
ObjectB的标题:"苹果很棒"(1/3条款)
ObjectB的描述:"苹果室里有苹果,现在苹果在苹果上都变坏了!" (4/18条款)
标题字段没有提升(或者更确切地说,提升为1),描述字段的提升为0.8.我没有通过solrconfig.xml或通过我正在通过的查询指定文档提升.如果有另一种指定文档提升的方法,那么我有可能错过一个.
在分析explain
打印输出之后,看起来ObjectA 正在计算比ObjectB更高的分数,就像我想要的那样,除了一个区别:ObjectB的标题fieldNorm总是高于ObjectA.
以下是explain
打印输出.您知道:标题字段是mditem5_tns
,描述字段是mditem7_tns
:
ObjectB:
1.3327172 = (MATCH) sum of:
1.0352166 = (MATCH) max plus 0.1 times others of:
0.9766194 = (MATCH) weight(mditem5_tns:appl in 0), product of:
0.53929156 = queryWeight(mditem5_tns:appl), product of:
1.8109303 = idf(docFreq=3, maxDocs=9)
0.2977981 = queryNorm
1.8109303 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of:
1.0 = tf(termFreq(mditem5_tns:appl)=1)
1.8109303 = idf(docFreq=3, maxDocs=9)
1.0 = …
Run Code Online (Sandbox Code Playgroud) 我阅读了有关在 Elasticsearch 中提升的内容。我们可以在索引或查询时应用 boosting。索引时间提升是一种静态提升,不建议使用。查询时间提升本质上是动态的。查询时间提升是很好的首选方法。
我们还可以为字段添加增强功能。例如,我们在多个字段中搜索一个术语。我们可以提升一个字段来改变文档的分数。
{
"match":{"title":{"query":"test string","boost":10}}
},
Run Code Online (Sandbox Code Playgroud)
我读过体重。
{
"filter": { "match": { "test": "cat" } },
"weight": 42
}
Run Code Online (Sandbox Code Playgroud)
我的理解是在字段上应用权重以改变相关性或分数。Boost 应用于查询以更改相关性或分数。
但我不确定重量和提升的差异。
有人可以通过一些例子纠正我理解重量和提升之间的区别吗?
所以我已经实现并成功使用了Solr 4.我必须说Solr 4真棒!无论如何,我成功地按距离排序并使用地质过滤器将结果限制在某个区域.我现在想做的是通过距离的倒数提高相关性得分.这个页面讨论它但没有说明如何做(http://wiki.apache.org/solr/SpatialSearch)
我试过以下但它给了我一个错误:
http://localhost:8983/solr/select/?q={!boost b=recip(geodist(), 1, 1000, 1000)}...
我得到的错误是:
org.apache.lucene.queryParser.ParseException: Expected identifier at pos 27 str='{!boost b=recip(geodist(), 1, 10 in ...
任何帮助,将不胜感激.谢谢!
我试图在 APACHE SOLR 中实现一个逻辑,以便根据天数或月数的差异,超过 2 年的文档应该受到惩罚。
我正在使用这个增强功能,这是我在谷歌上搜索了很多之后得到的。
recip(ms(NOW,publicationDate),3.16e-11,1,1) // Currently it is set to use 1 year
Run Code Online (Sandbox Code Playgroud)
任何人都可以确认这是惩罚旧文件还是什么?
谢谢
我正在使用SolrNet访问Solr索引,其中我有一个名为"tags"的多值字段.我想执行以下伪代码查询:
(tags:stack)^ 10 OR(tags:over)^ 5 OR(tags:flow)^ 2
术语"堆叠"被提升10,"超过"被提升5,"流"被提升2.我所追求的结果是"叠加"的结果将显得高于"叠加"的结果流动"等
我遇到的问题是说"流"只出现在几个文档中,但是"堆栈"出现在加载中,然后由于高的idf值,带有"flow"的文档出现在带有"stack"的文档之上.
当这个项目在Lucene中直接实现时,我使用了ConstantScoreQuery,这些仅仅根据提升值消除了基于idf的idf.
如何通过Solr和SolrNet实现这一点,我有效地将Solr传递给查询字符串?如果不能,有没有其他方法可以解决这个问题?
提前致谢!
solr-boost ×9
solr ×6
lucene ×4
boost ×1
distance ×1
django ×1
exact-match ×1
geospatial ×1
nested ×1
relevance ×1
scoring ×1
solrnet ×1