gpt4 book ai didi

solr - 阻止 SOLR 多次索引同一个词(或如何提升一个字段)

转载 作者:行者123 更新时间:2023-12-04 04:39:14 26 4
gpt4 key购买 nike

所以我正在运行一个俚语词典类型的网站,并且以前一直使用 mysql LIKE 进行站点搜索。它工作正常。无论如何,现在我正在更新网站并考虑将 django-haystack 与 SOLR 一起使用(似乎是最好的搜索选项之一?)

我让它运行了,但搜索结果并不好。例如,搜索“LOL”这个词会给出“Flood”作为第一个结果,因为它也有一个用“LOL LOL LOL LOL LOL LOL”泛滥的例子,而不是首先显示 LOL 这个词。

那么是否可以只标记 Flood 示例中的一个 LOL(我是 SOLR 的新手,所以我的想法可能是错误的)。或者我可以只提高单词标题的值(因此搜索词与标题匹配的词排在第一位,搜索词与示例匹配的词排在第二位)?我已经尝试过 django-haystack 场提升,但它似乎并没有做太多。

提前致谢!

编辑:这是 SOLR 方案(有点大,主要由 Django-Haystack 自动生成):

<?xml version="1.0" ?>
<schema name="default" version="1.1">
<types>
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>

<!-- Numeric field types that manipulate the value into
a string value that isn't human-readable in its internal form,
but with a lexicographic ordering the same as the numeric ordering,
so that range queries work correctly. -->
<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/>

<fieldType name="date" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<!-- find finnish ones <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> -->
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="Finnish" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="Finnish" />
<!-- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> -->
<!-- find finnish ones <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> -->
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>

<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
</analyzer>
</fieldType>

<fieldType name="ngram" class="solr.TextField" >
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
</analyzer>
</fieldType>
</types>

<fields>
<!-- general -->
<field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
<field name="django_ct" type="string" indexed="true" stored="true" multiValued="false" />
<field name="django_id" type="string" indexed="true" stored="true" multiValued="false" />

<dynamicField name="*_i" type="sint" indexed="true" stored="true"/>
<dynamicField name="*_s" type="string" indexed="true" stored="true"/>
<dynamicField name="*_l" type="slong" indexed="true" stored="true"/>
<dynamicField name="*_t" type="text" indexed="true" stored="true"/>
<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>
<dynamicField name="*_f" type="sfloat" indexed="true" stored="true"/>
<dynamicField name="*_d" type="sdouble" indexed="true" stored="true"/>
<dynamicField name="*_dt" type="date" indexed="true" stored="true"/>


<field name="rendered" type="string" indexed="false" stored="true" multiValued="false" />

<field name="word" type="text" indexed="true" stored="true" multiValued="false" />

<field name="author" type="text" indexed="true" stored="true" multiValued="false" />

<field name="text" type="text" indexed="true" stored="true" multiValued="false" />

<field name="explanation" type="text" indexed="true" stored="true" multiValued="false" />

<field name="example" type="text" indexed="true" stored="true" multiValued="false" />

</fields>

<!-- field to use to determine and enforce document uniqueness. -->
<uniqueKey>id</uniqueKey>

<!-- field for the QueryParser to use when an explicit fieldname is absent -->
<defaultSearchField>text</defaultSearchField>

<!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
<solrQueryParser defaultOperator="AND" />
</schema>

最佳答案

你最后的评论为我清除了它。你需要看的是Relevance in general在您的情况下,特别是 Field Boosting。

为了在字段上使用查询时间提升,您需要使用 Solr 的 DisMax 处理程序或其扩展名 eDisMax 处理程序。你可以通过它的' qf parameter 告诉那个处理程序要搜索哪些字段以及每个字段的提升方式。

例如

qf="word^10.0 title^5.0 exmaple^0.5"
  • 如果文档与单词匹配,则将该分数增加 10
  • 如果文档与标题匹配,则将该分数增加 5
  • 如果文档与示例中的命中匹配,则将该分数增加 0.5,这相当于递减

  • 您可以在发送给 Solr 的每个搜索查询中添加该 qf 参数,也可以在 solrconfig.xml 中配置它。

    <requestHandler name="standard" 
    class="solr.StandardRequestHandler" default="true">
    <!-- default values for query parameters -->
    <lst name="defaults">
    <str name="defType">edismax</str>
    <str name="q.alt">*:*</str>
    <str name="qf">word^10.0 title^5.0 exmaple^0.5</str>
    <str name="fl">*,score</str>
    <str name="mm">100%</str>
    </lst>
    </requestHandler>

    <queryParser name="edismax"
    class="org.apache.solr.search.ExtendedDismaxQParserPlugin" />

    一些进一步的阅读
  • http://www.solrtutorial.com/solr-search-relevancy.html
  • http://wiki.apache.org/solr/SolrRelevancyCookbook
  • 关于solr - 阻止 SOLR 多次索引同一个词(或如何提升一个字段),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19199534/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com