当前位置: 首页 > 知识库问答 >
问题:

Solr atomic update删除以前的更新

赏光霁
2023-03-14
public void updateDocsByQuery(String queryStr, String fieldName, String fieldValue) 
        throws Exception {

    SolrDocumentList docList = fetchDocsByQuery(queryStr, "id" , 5000);

    if (!docList.isEmpty()) {
        Collection<SolrInputDocument> docs = new ArrayList<>();

        for (int i=0; i<docList.size(); i++) {
            SolrDocument doc = docList.get(i);
            String id = (String) doc.getFieldValue("id");

            SolrInputDocument inputDoc = new SolrInputDocument();
            inputDoc.addField("id", id);
            Map<String, Object> fieldMod = new HashMap<>(1);
            fieldMod.put("set", fieldValue);
            inputDoc.addField(fieldName, fieldMod);

            docs.add(inputDoc);

        }                       

        client.add(docs);
        client.commit();
    }               
}

我的架构是

  <schema name="MySchema" version="1.5">
<fields>
    <field name="_version_" type="long" indexed="true" stored="true"/>
    <field name="id" type="string" indexed="true" stored="true"  required="true" multiValued="false" />  

    <field name="title" type="text_en" indexed="true" stored="true" multiValued="false" termVectors="true" termPositions="true" termOffsets="true"   />
    <field name="subject" type="text_en" indexed="true" stored="true"/>
    <field name="author" type="text_en" indexed="true" stored="true"/>
    <field name="keywords" type="text_en" indexed="true" stored="true"/>
    <field name="category" type="text_en" indexed="true" stored="true"/>
    <field name="suggested_links" type="string" indexed="true" stored="true" />
    <field name="resourcename" type="string" indexed="true" stored="true" docValues="true" />
    <field name="resource_names" type="string" indexed="true" stored="true" multiValued="true" docValues="true" />
    <field name="content_type" type="string" indexed="true" stored="true"  docValues="true"/>
    <field name="last_modified" type="date" indexed="true" stored="true"/>
    <field name="source_group" type="string" indexed="true" stored="true" />

    <!-- Main body of document -->
    <field name="content" type="text_en" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"   />

    <!-- catchall field, containing all other searchable text fields (implemented via copyField further on in this schema  -->
    <field name="text" type="text_en" indexed="true" stored="false" multiValued="true"  />

<!-- holds Solr dedupe hash code -->
<field name="dedupeSignatureField" type="string" indexed="true" stored="true" multiValued="false" /> 

 <!-- copy fields to search by default in our catch-all field, 'text' -->

 <copyField source="title" dest="text"/> 
 <copyField source="subject" dest="text"/>
     <copyField source="author" dest="text"/> 
     <copyField source="keywords" dest="text"/> 
     <copyField source="content" dest="text"/> 

</fields>

<uniqueKey>id</uniqueKey>

<types>

    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <filter class="solr.PorterStemFilterFactory"/>
          </analyzer>
          <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
            <filter class="solr.PorterStemFilterFactory"/>
        </analyzer>
     </fieldType> 
</types>

在此输入代码

共有1个答案

徐瀚
2023-03-14

我在使用Solr5.4.0时也遇到了这个问题。只有docList中的最后一个文档被用来更新该值,其余的文档被删除。

我的解决方案,在您的代码中替换:

inputDoc.addField("id", id);

inputDoc.setField("id", id);
 类似资料:
  • 问题内容: 我正在使用Spring JPA存储库将Twitter推文保存在数据库中。鸣叫的日期在MySQL数据库中另存为Datetime。现在,我想删除所有超过一年的推文。我看到有功能,想到了类似的东西。我知道那不是正确的语法,但是我不知道该怎么做。这是我所拥有的: 编辑已解决: 仓库: 服务: 问题答案: 为此,您需要2个步骤。首先,您需要一个方法,该方法将要删除消息的日期作为参数,并且根本不需

  • null null 当我关注文本字段时,背景和边框颜色分别变为黄色和绿色(通过css)。 如果单击submit而不输入任何内容,边框颜色将变为红色(通过javascript)。 但当我再次将焦点放在文本字段时,红色边框颜色并没有消失,而是同时出现绿色和红色边框。 我只希望它是绿色的。你能不能也解释一下这种行为的原因。

  • 问题内容: 在很多情况下,您需要根据某些条件执行INSERT,UPDATE或DELETE语句。我的问题是,对查询性能的影响是否在命令前添加了IF EXISTS。 例子 INSERT或DELETE呢? 问题答案: 我不太确定,但是我得到的印象是,这个问题实际上是关于upsert的,它是以下原子操作: 如果该行同时存在于源和目标中,则为目标。 如果该行仅存在于源中,则该行进入目标;否则,该行进入目标。

  • 插入、更新和删除语句基于以开头的层次结构生成 UpdateBase . 这个 Insert 和 Update 构建基于中介的 ValuesBase . DML基础构造函数 顶级的“插入”、“更新”、“删除”构造函数。 Object Name Description delete(table[, whereclause, bind, returning, ...], **dialect_kw) 构建

  • 我有父实体和一个方向作为具有关系的子实体。我尝试使用Hibernate查询删除超过一周的广告,但得到的结果是: com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityConstraintViolationException:无法删除或更新父行:外键约束失败(.,constraint外键()引用() 用户: 筛选器: 广告: DAO删除方法:

  • 我正在编写C++来解决这个问题,从leetcode:https://leetcode.com/problems/remove-element/ 给定数组nums和值val,移除该值的所有实例并返回新的长度。 不要为另一个数组分配额外的空间,您必须用O(1)个额外内存修改输入数组。 元素的顺序可以更改。你在新长度之外留下什么并不重要。 您的函数应该返回长度=2,nums的前两个元素为2。 在返回长度